if(1) x++, y++;
の代わりにif(1) {x++; y++;}
のコードを書くことができますが、場合によっては機能しません(以下を参照)。これについて教えていただければ嬉しいです。
int x = 5, y = 10;
if (x == 5) x++, y++; // It works
if (x == 5) x++, return 0; // It shows an error
for
ループにも同じことが当てはまります。
for (int i = 0; i < 1; i++) y++, y += 5; // It works
for (int i = 0; i < 1; i++) y++, break; // Does not work
return
とbreak
はステートメントであり、式ではないためです。そのため、いかなる方法でも別の式で使用することはできません。 if
およびその他も同様にステートメントです。
ただし、式に入れ子にならないように(return
の)式を書き換えることができます。次のようなコードを書くことはお勧めしません。
return x++, 0;
式を受け入れないため、break
に対してはできません。
コンマ演算子は式用です。
return
ステートメントおよびその他の純粋なステートメントは式ではありません。
コンマ演算子は、2つの値を取る2項演算子です。この方法では、+
または*
と同じです。 +
は2つの値を追加して結果を返し、*
は2つの値を乗算して結果を返しますが、カンマ演算子は単に左側の値を無視して右側の値を返します。
2 + 5
の値は7
です
2 * 5
の値は10
です
2 , 5
の値は5
で、単に演算子の右側のオペランドです。
したがって、2,break
を記述できないのと同じ理由で、2+break
を記述できません。 breakは値ではなくステートメントであるためです。
オペランドの1つを無視する2項演算子とは何ですか?コンマ演算子は左オペランドの値を無視しますが、式はまだ評価されます。その式の副作用はまだ実現されています。考慮してください:
i = 2;
j = 5;
i++, j++;
最初に、2つの式が評価されます。 i++
は2
の値を返し、i
をインクリメントします。 j++
は5
の値を返し、j
をインクリメントします。最後に、次の2つの値にカンマ演算子が適用されます。2,5
は、2
を無視し、5
を返します。