何かと、カウンターで処理をすることが多いと思います。

たとえば、

// カウンタの数値で分岐
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()で判断しなくても上限チェックが出来るわけです。