ProgrammingC開発者、システムプログラマ

C言語におけるカンマ演算子の動作を説明してください。いつ使用するのが理にかなっているのか、開発者がよく遭遇する誤り、そして予期しない効果は何ですか?

Hintsage AIアシスタントで面接を突破

答え

C言語におけるカンマ演算子 , は、2つ以上の式を結合し、左から右へ順番に評価し、最後の式の値を返します:

int x = (f(), g()); // f() と g() が呼び出され、xにはg()の結果が入る

最も一般的にforループで使われます:

for(int i = 0, j = 10; i < j; ++i, --j) { ... }

有用な場合:

  • 初期化やインクリメント時に複数の式を短く書く必要がある場合。

落とし穴:

  • カンマの優先順位は非常に低いため、複雑な式では重要です;
  • コンテキスト外での使用(例えばreturnや代入で)により、予期しない結果をもたらすことがあります;
  • 括弧なしでの使用はプログラマやコンパイラを混乱させる可能性があります。

ひっかけ問題

質問: 次のコードは何を表示しますか?

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)) です。