Почему return 0 или break не работают с оператором запятой?

Я могу написать код, if(1) x++, y++; вместо 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

Ответ 1

Это потому, что return и break являются операторами, а не выражениями. Таким образом, вы не можете использовать его в другом выражении любым способом. if и другие аналогичны также утверждениям.

Однако вы можете переписать свое выражение (для return), чтобы оно не было вложено в выражение - не то, что я рекомендую написать такой код:

return x++, 0;

Вы не можете сделать это для break потому что оно не принимает выражение.

Ответ 2

Оператор запятой предназначен для выражений.

Оператор return и другие чистые выражения не являются выражениями.

Ответ 3

Оператор запятой является двоичным оператором, который принимает два значения. Таким образом, это то же самое, что и + или *. В то время как + добавляет два значения и возвращает результат, а * умножает два значения и возвращает результат, оператор запятой просто игнорирует значение слева и возвращает значение справа.

2 + 5 имеет значение 7

2 * 5 имеет значение 10

2, 5 имеет значение 5, просто операнд справа от оператора.

И поэтому вы не можете писать 2,break по той же причине, что вы не можете написать 2+break. Потому что break - это оператор, а не значение.

Каким образом используется двоичный оператор, который игнорирует один из своих операндов? Оператор запятой игнорирует значение левого операнда, но выражение все еще оценивается. Любые побочные эффекты этого выражения все еще реализуются. Рассматривать:

i = 2;
j = 5;
i++, j++;

Сначала оцениваются два выражения. i++ возвращает значение 2, а затем увеличивает i. j++ возвращает значение 5, а затем увеличивает j. Наконец, к этим двум значениям применяется оператор запятой: 2,5 который игнорирует 2 и возвращает 5.