Thinkers'Studio
JavaとC言語の自習ツール
for文で複数の式を書く例(コンマ演算子)

 式を複数書くときは、{ } で囲んでブロックにします。
 しかし、for文の ( ) 内のようにブロックが使えない場所では、コンマ演算子を使って式を書き並べます。
 コンマ演算子は、演算子の優先順位の表では一番下に出てきます。
 変数宣言で変数を区切ったり、関数引数の区切りに使うコンマは、コンマ演算子ではありません。

コンマ演算子が使われるのは、ほとんどの場合 for文の式1か式3です

for文で複数の式を書き並べる例1 】
#include <stdio.h>
main()
{
    int i, j;

    for( i = 0, j = 10; i < j; i++, j-- )
        printf( "%d, %d\n", i, j );
}
 実行結果
0, 10
1, 9
2, 8
3, 7
4, 6
for文で複数の式を書き並べる例2 】
#include <stdio.h>
#include <ctype.h>
main()
{
    int i;
    char *p, str[] = "Lupin 3rd";

    for( p = str, i = 0; !isspace(*p) && *p != '\0'; p++, i++ )
        printf( "str[%d]:%c\n", i, *p );
}
 *p がスペース文字でなく、'\0'でもないあいだプリントします。
 str にスペース文字が含まれていないときに備えて *p != '\0' も必要です。
 実行結果
str[0]:L
str[1]:u
str[2]:p
str[3]:i
str[4]:n

コンマ演算子の評価は一番右の式の値

 コンマ演算子を使った評価の結果は、一番右に書いた式の値となります。

【実験します】
 上の例2で、繰り返しを続ける条件式を && でなく、コンマ演算子でつないだとすると、どうなるでしょう?
 for を、次のように変えた場合です。

for( p = str, i = 0; !isspace(*p), *p != '\0'; p++, i++ )
 実行結果は次のようになります。
str[0]:L
str[1]:u
str[2]:p
str[3]:i
str[4]:n
str[5]: 
str[6]:3
str[7]:r
str[8]:d

&& でつないだ場合

 左の式が false ならそこで評価を終わり、右の条件は調べられません。

コンマ演算子でつなぐと

 左の式の評価結果に関わらず、必ず右の式が実行され、それが全体の評価となります。
 一番右の式 *p != '\0' だけが繰り返し条件として評価されるので、いつでも '\0' の前までの全ての文字が表示されます。

(今回のクイズです)
 次のプログラムは、while文の条件部にコンマ演算子を使った例です。
 これを実行したとき最後に表示される i, j, k は、どんな値になるでしょう?
#include <stdio.h>
main() {
    int i = 3, j = 5, k = 7;

    while( i, j, k ) {
        printf( "%d, %d, %d\n", i, j, k );
        i--; j--; k--;
    }
}
   (答えは、次回のC言語の Tips で ・・・)
   (前回のクイズは、ありませんでした)