read-eval-print loop

プログラミング関連のメモ

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

INT02-C. 整数変換のルールを理解する

*1:正確には、符号なし整数で値が表現できない場合は、最大値より1大きい値で割った余りになることと-1 = -1* (UINT_MAX+1) + UINT_MAXから