コンマ演算子 , は何をしますか?

式:

(expression1,  expression2)

最初に式 1 が評価され、次に式 2 が評価され、式全体に対して式 2 の値が返されます。


while で最も多く使用されているのを見てきました ループ:

string s;
while(read_string(s), s.len() > 5)
{
   //do something
}

操作を実行してから、副作用に基づいてテストを実行します。もう 1 つの方法は、次のようにすることです:

string s;
read_string(s);
while(s.len() > 5)
{
   //do something
   read_string(s);
}

コンマ演算子は左側のオペランドを評価し、結果を破棄してから右側のオペランドを評価し、それが結果になります。 慣用 リンクに記載されている使用は、 for で使用される変数を初期化するときです ループし、次の例を示します:

void rev(char *s, size_t len)
{
  char *first;
  for ( first = s, s += len - 1; s >= first; --s)
      /*^^^^^^^^^^^^^^^^^^^^^^^*/ 
      putchar(*s);
}

そうでなければ、多くの すばらしい ものはありません コンマ演算子の使用 ただし、読みにくく、維持しにくいコードを悪用するのは簡単です。

ドラフト C99 標準の文法は次のとおりです。

expression:
  assignment-expression
  expression , assignment-expression

そしてパラグラフ2 言います:

脚注 97 言います:

つまり、カンマ演算子の結果に割り当てることはできません .

コンマ演算子の優先順位が最も低いため、() を使用する場合があることに注意することが重要です。 たとえば、

#include <stdio.h>

int main()
{
    int x, y ;

    x = 1, 2 ;
    y = (3,4) ;

    printf( "%d %d\n", x, y ) ;
}

次の出力が得られます:

1 4