为什么返回0或break不适用于逗号运算符?

时间:2018-08-21 06:38:25

标签: c++ c comma comma-operator

我可以编写代码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

3 个答案:

答案 0 :(得分:60)

这是因为returnbreak是语句,而不是表达式。因此,您不能以任何方式在另一个表达式中使用它。 if和其他类似的语句。

但是,您可以做的是重写表达式(对于return),以使它不嵌套在表达式中-不建议我这样编写代码:

return x++, 0;

您不能为break这么做,因为它不接受表达式。

答案 1 :(得分:11)

逗号运算符用于表达式。

return语句和其他纯语句不是表达式。

答案 2 :(得分:3)

逗号运算符是采用两个值的二进制运算符。这样,它与+*相同。 +将两个值相加并返回结果,而*将两个值相乘并返回结果,而逗号运算符只是忽略左边的值而返回右边的值。

2 + 5的值为7

2 * 5的值为10

2 , 5的值为5,仅是运算符右边的操作数。

因此,您无法写2,break的原因与您无法写2+break的原因相同。 因为break是语句,而不是值。

忽略二进制操作数之一的二进制运算符有什么用?逗号运算符会忽略左操作数的值,但仍会对该表达式求值。 该表达的任何副作用仍然可以实现。考虑:

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

首先对两个表达式求值。 i++返回值2,然后递增ij++返回值5,然后递增j。最后,将逗号运算符应用于这两个值:2,5,它将忽略2并返回5