■
何かと、カウンターで処理をすることが多いと思います。
たとえば、
// カウンタの数値で分岐 switch( cnt ){ case 0: hoge(); break; case 1: huga(); break; case 5: foo(); break; case 11: huge(); break; default: printf( "Another code\n" ); break; } cnt++; if( cnt > 15 ){ cnt = 0; }
上のプログラムはただ、cntの値を見てそれぞれの処理をしているだけです。
下で、cntをインクリメントし、値が15より大きくなったら0クリアしているものです。
しかし、このカウンタの上限チェックを簡単することが出来ます。しかも1行で。
・インクリメントの場合
cnt = (cnt + 1) % N; // N・・・上限値
例(上限値が10の場合):
- cnt = (7 + 1) % 10; // cnt = 8;
- cnt = (8 + 1) % 10; // cnt = 9;
- cnt = (9 + 1) % 10; // cnt = 0;
- cnt = (0 + 1) % 10; // cnt = 1;
cntが0〜9でループ
・デクリメントの場合
cnt = (cnt + (N-1)) % N; // N・・・上限値
例(上限値が10の場合):
- cnt = (3 + (10-1)) % 10; // cnt = 12 % 10 = 2;
- cnt = (2 + (10-1)) % 10; // cnt = 11 % 10 = 1;
- cnt = (1 + (10-1)) % 10; // cnt = 10 % 10 = 0;
- cnt = (0 + (10-1)) % 10; // cnt = 9 % 10 = 9;
cntが0〜9でループ
このように、いちいちif()で判断しなくても上限チェックが出来るわけです。