C言語におけるカンマ演算子 , は、2つ以上の式を結合し、左から右へ順番に評価し、最後の式の値を返します:
int x = (f(), g()); // f() と g() が呼び出され、xにはg()の結果が入る
最も一般的にforループで使われます:
for(int i = 0, j = 10; i < j; ++i, --j) { ... }
有用な場合:
落とし穴:
質問: 次のコードは何を表示しますか?
int a = 1; int b = (a = 2, a + 3); printf("%d ", b);
答え: "5"が表示されます。最初にa=2が代入され、その後式a+3が2+3=5を評価し、これが変数bに代入されます。
事例
Cプロジェクトで、開発者がreturn関数内でカンマ演算子を括弧なしで使用しました:
return x++, y++;y+1を返すことを期待していましたが、実際にはreturnは右側の式の結果のみを認識し、左側のx++は別に評価されます。これにより、使用者のコードが混乱し、returnの結果が期待通りではなくなりました。
事例
あるforループで、プログラマはセミコロンの代わりにカンマを誤って使用しました:
for(i=0, i<10, i++) ...プログラムはコンパイルされましたが、ループは1回しか実行されませんでした。なぜならforの条件内の式i<10, i++は常に最後の式の値(i++)を返し、ループが続行される条件を評価しないからです。
事例
マクロを書く際、ある開発者が次のように定義しました:
#define DO(x, y) x, y int v = DO(f(), g());両方の関数が呼び出されることを期待していましたが、括弧を付けるのを忘れました。その結果、f()のみが呼び出され、g()の値はvに代入されませんでした。正しい使用法は
#define DO(x, y) ((x), (y))です。