読者です 読者をやめる 読者になる 読者になる

methaneのブログ

このブログに乗せているサンプルコードはすべてNYSLです。

神は細部に宿る

program

ダウンカウントのやり方。

  for( int i = 0; i < 10; ++i )

を逆にしてみる。

  for( int i = 9; i >= 0; --i )

でもいいが、アップカウントの時の逆になっていない。

  for( int i = 9; i > -1; --i )

の方が、アップカウントの時と対称性が取れてる。0の方がキリが良いから良いように思えるが、それは範囲の下限が0の場合だけという特殊例であり、美しくない。[begin,end)で統一しよう。

また、最初のアップカウントでintが負の値を取らないが、これもたまたまであり、逆向きにするだけで負の値が必要になる。unsignedを使っていいのは、配列のindexのように定義域に負の値が含まれない時や、bit演算をするときだけ。たまたま負の値を使わないだけならsignedが正解。悩んだらとりあえずsignedにすること。unsignedを好むのは小さい数値にcharやshortを使うのを好むのと同じで初心者丸出しカッコ悪い。

追記:
コメントでも指摘されたけど、やっぱり前者の方がぱっと理解しやすい。人間の頭の中は感嘆には逆向きになれない。
上の例はマジックナンバーでやってるけど、

  for( int i = 0; i < N; ++i )

の逆なら

  for( int i = N - 1; i >= 0; --i )

の方が同じ範囲だと判りやすい。[begin,end)は基本ルールとして、endからbeginに向かってカウントダウンする感じ。
でも、begin,endの定義自体を逆転して[begin,end)する方が汎用的な方法というのは覚えておいて欲しい。C++STLでの[rbegin,rend)は正しい実装。