++演算子と--演算子


●ここでは,変数の値を1つ増やしたり,1つ減らしたりする++演算子と--演算子について
 学習する。


  1. 前ページのwhile文のサンプルプログラムは次のようになっていた。

    /* while.c */
    #include <stdio.h>
    
    int main( void ) {
      int n = 0;
      int i = 0;
      printf( "n = " ); scanf( "%d", &n );
    
      i = 0;
      while ( i < n ) {
        printf( "hello!¥n" );
        i = i + 1;
      }
      return 0;
    }

    上図の i = i + 1; という部分は,変数iを1増やしている。このように,変数の値を1だけ増やしたり
    1だけ減らしたりする処理は,プログラムではよく用いられる。

    そのため,C言語には,
     ・変数の値を1だけ増やす++演算子(インクリメント演算子)
     ・変数の値を1だけ減らす--演算子(デクリメント演算子)
    が用意されている(下図)。





    前置形式と後置形式の違い

     上図のように,++演算子と--演算子は,変数の前に書いても後ろに書いても良い。
    変数の前に書く方式を「前置形式変数の後ろに書く方式を「後置形式と言う。

    前置形式と後置形式は,ともに変数の値を1だけ増やしたり減らしたりするという基本
    的な働きは同じである。

    しかし,++演算子と--演算子を式の中で使用すると,意味が異なってくる部分がある。
    次の簡単なプログラムをこのページからコピー&ペーストして手早く実行せよ。コピー
    &ペーストするときに,円マーク(バックスラッシュ)が日本語文字になっていないかに
    注意。

    /* incdec2.c */
    #include <stdio.h>
    
    int main( void ) {
      int a = 5;
      int b = 5;
      printf( "++a : %d¥n", ++a ); /* 前置形式の式の値を表示 */
      printf( "b++ : %d¥n", b++ ); /* 後置形式の式の値を表示 */ 
    
      printf( "a is %d¥n", a ); /* 変数aの値をあらためて表示 */
      printf( "b is %d¥n", b ); /* 変数bの値をあらためて表示 */
      return 0;
    }

    このプログラムは,5という値を持つ変数a,bを++演算子で値を1増やしている式の値を
    表示している。その後,あらためてaとbの値を表示している。両者は前置形式か後置形
    式化かが違うだけである。実行結果は次のようになる。

    ++a : 6
    b++ : 5
    a is 6
    b is 6

    前置形式と後置形式がまったく同じ意味を持っているなら,実行結果の1行目と2行目は
     ++a : 6
     b++ : 6

    まったく同じ結果にならなければおかしいが,実際には異なっている(!)。

    実は,
      ・前置形式の式 ++a を式の中で使うと,まずaの値を1増やして,その結果が式で使われる
      ・後置形式の式 a++ を式の中で使うと,式では1増やされる前のbの値が使われ,その後変数bの値が1増やされる
    という違いがあるのである。

    つまり,
     printf( "++a : %d¥n", ++a );
    では,aの値が増やされ,その結果である6が表示されているのである。また,
     printf( "b++ : %d¥n",b++);
    では,変更される前のbの値が表示され,その後,bの値が1増やされるのである。

    --演算子でも事情は同じで,
      ・前置形式の式 --a を式の中で使うと,まずaの値を1減らして,その結果が式で使われる
      ・後置形式の式 b-- を式の中で使うと,式では1減らされる前のbの値が使われ,その後変数bの値が1減らされる
    という違いがある

    例)コピーして手早く実行してみよ。実行結果をよく見て,前置形式・後置形式の効果の違いを確認せよ。
    /* incdec3.c */
    #include <stdio.h>
    
    int main( void ) {
      int a = 5, b = 5, c = 5, d = 0;
      
      d = a-- * ++b - --c;
      
      printf( "a is %d¥n", a ); /* a is 4  と表示 */
      printf( "b is %d¥n", b ); /* b is 6  と表示 */
      printf( "c is %d¥n", c ); /* c is 4  と表示 */
      printf( "d is %d¥n", d ); /* d is 26 と表示 */
      return 0;
    }


    問題:前ページのwhile文のサンプルプログラム(下図)の赤い行を,++演算子を使って書き直せ。
    /* while.c */
    #include <stdio.h>
    
    int main( void ) {
      int n = 0;
      int i = 0;
      printf( "n = " ); scanf( "%d", &n );
    
      i = 0;
      while ( i < n ) {
        printf( "hello!¥n" );
        i = i + 1;
      }
      return 0;
    }