forループで符号なし整数を使って0までカウントダウンする
for
文で符号なし整数を0までカウントダウンする場合、当然ですが>= 0
という条件は使えません。
// 条件が常に真になるため無限ループ for (unsigned int i = n-1; i >= 0; i--)
可能ならば符号付き整数にキャストしてしまう、i == 0
の場合をfor
の外に出す、といった方法が考えられますが、よりスマートに次のようにも書くことができます。
for (unsigned int i = n; i-- > 0; )
本文のi
もちゃんと欲しい値になっています。
また、符号なし整数がラップアラウンドすることを利用して*1、次のように書くことができます。
for (unsigned int i = n-1; i != UINT_MAX; i--) // もしくは for (unsigned int i = n-1; i != -1; i--)
-1
は整数変換のルールによりUINT_MAX
に変換されることに注意。
残念ながら、どちらの方法も初期値が最大値を取る場合は使えません。
参考:
c++ - Reverse iteration with an unsigned loop variable - Stack Overflow
*1:正確には、符号なし整数で値が表現できない場合は、最大値より1大きい値で割った余りになることと-1 = -1* (UINT_MAX+1) + UINT_MAXから