C言語のカンマ演算子(,)は、最後の式の値を結果とする複数の式を結合することを許可します。
例:
int a = 1, b = 2, c; c = (a += 2, b += 3, a + b); // まずaを増やし、次にbを増やし、最後にa + bを足す
使用法:
forループのヘッダーで使用されます。細かい点:
ループの例:
for (i = 0, j = 10; i < j; ++i, --j) { /* ... */ }
カンマは演算子としてと、関数の引数リストでの区切り文字としての違いは何ですか?
一般的な誤り: カンマはどこにでも演算子であり、常に式を結合すると考えられています。
正しい答え: カンマは初期化リスト、引数リスト、および配列要素の外では演算子です。例えば:
int x = (1, 2); // x == 2、ここでは演算子 void foo(int a, int b) { ... } // ここでは区切り文字
カンマは演算子としては括弧内でのみ機能し、それ以外の場合は単なる区切り文字です。
物語
マクロ内でdo { ... } while (0)の部分でカンマ演算子を使用して命令を括弧なしで結合した結果、if (a) MACRO(); else ...のようなもので文法エラーが発生しました。
物語
カンマ演算子の優先順位と代入の優先順位の混乱により、式a = b, c = d;は(a = b), (c = d)のように動作し、プログラマーは両方の代入が同時に1つの式の一部として実行されると予想していました。
物語
関数内でカンマを使って連続して関数を呼び出しましたが、最終的な値しか返されないことが無視されていました。結果の式がすべての呼び出しの効果を結びつけると想定されましたが、実際には最初の呼び出しの副作用だけが重要であり、それらの返り値は失われました。