Programmingミドルバックエンド開発者

C言語におけるカンマ演算子の機能を説明してください。その使用が正当化される場合と、評価順序のあいまいな理解によって発生する可能性のある予期しない副作用は何ですか?

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

回答。

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つの式の一部として実行されると予想していました。


物語

関数内でカンマを使って連続して関数を呼び出しましたが、最終的な値しか返されないことが無視されていました。結果の式がすべての呼び出しの効果を結びつけると想定されましたが、実際には最初の呼び出しの副作用だけが重要であり、それらの返り値は失われました。