web-dev-qa-db-ja.com

コンマ演算子で0またはbreakが機能しないのはなぜですか?

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
41
Nayem

returnbreakはステートメントであり、式ではないためです。そのため、いかなる方法でも別の式で使用することはできません。 ifおよびその他も同様にステートメントです。

ただし、式に入れ子にならないように(returnの)式を書き換えることができます。次のようなコードを書くことはお勧めしません。

return x++, 0;

式を受け入れないため、breakに対してはできません。

60
Rakete1111

コンマ演算子は式用です。

returnステートメントおよびその他の純粋なステートメントは式ではありません。

11
Yunnosch

コンマ演算子は、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を返します。

3
David Dubois