为啥 return 0 或 break 不能与逗号运算符一起使用?

Posted

技术标签:

【中文标题】为啥 return 0 或 break 不能与逗号运算符一起使用?【英文标题】:Why does return 0 or break not work with the comma operator?为什么 return 0 或 break 不能与逗号运算符一起使用? 【发布时间】:2019-01-27 07:16:57 【问题描述】:

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

【问题讨论】:

你需要了解表达式语句的区别。 另请注意,使用the comma expression 的方式往往会使代码更难阅读、理解和维护。 因为逗号运算符的语法不是这样定义的......仅此而已。 int i = break; 不起作用的原因相同。 你为什么还要这样做?只需使用大括号。它更清晰,更易于理解。 【参考方案1】:

逗号运算符用于表达式。

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

【讨论】:

结论呢? @PeterMortensen 我回答了“为什么?”问题,不是吗?你的观点是什么?【参考方案2】:

这是因为returnbreak 是语句,而不是表达式。因此,您不能以任何方式在另一个表达式中使用它。 if 等也是同样的声明。

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

return x++, 0;

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

【讨论】:

一个很好的例子:x++ / 7x++, 7 之间没有明显的语法差异(/, 都是运算符)。同样的道理,x++, breakx++ / break 一样有意义:根本没有。 @Amadan 插图不错!下次我必须解释这个时我肯定会使用它:) 谢谢 @Amadan 有一个非常显着的区别(至少在 C++17 之前,不确定新规则):逗号运算符引发了先发生关系(或者用旧术语来说,引入了一个序列点),这意味着x++, x++ 已定义,而x++ / x++ 未定义。 @SebastianRedl:还有一个事实是, 返回第二个操作数,但/ 将事物分开,我想说这是一个更显着的差异:D。但从语法上讲,唯一使它们不同的是优先级(simplified here、more realistic here)。 但请不要这样做【参考方案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

【讨论】:

我不认为它会忽略左边的值,而是实际计算左边的表达式并返回右边的表达式。 是的,它计算表达式,...然后忽略它的值。我进行了编辑以使其更清晰。谢谢。 Nayem,这有帮助吗? @DavidDubois 为什么大家都说break 是一个声明?它不是! break; 是。 (对不起,我只是迂腐:) L.F.,你是对的。你会怎么填空呢? 'break' 是____,而不是值。

以上是关于为啥 return 0 或 break 不能与逗号运算符一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA- continue与break与return关键字

return 和break的区别

return 和break的区别

注意forEach不能使用return跳出循环

求return,break,continu区别

34 break与return的区别