为啥 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】:这是因为return
和break
是语句,而不是表达式。因此,您不能以任何方式在另一个表达式中使用它。 if
等也是同样的声明。
但是,您可以做的是重写您的表达式(对于 return
),使其不嵌套在表达式中 - 我不建议您编写这样的代码:
return x++, 0;
break
不能这样做,因为它不接受表达式。
【讨论】:
一个很好的例子:x++ / 7
和 x++, 7
之间没有明显的语法差异(/
和 ,
都是运算符)。同样的道理,x++, break
和x++ / 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
,然后递增 i
。 j++
返回值 5
,然后递增 j
。最后,逗号运算符应用于这两个值:2,5
忽略 2
并返回 5
。
【讨论】:
我不认为它会忽略左边的值,而是实际计算左边的表达式并返回右边的表达式。 是的,它计算表达式,...然后忽略它的值。我进行了编辑以使其更清晰。谢谢。 Nayem,这有帮助吗? @DavidDubois 为什么大家都说break
是一个声明?它不是! break;
是。 (对不起,我只是迂腐:)
L.F.,你是对的。你会怎么填空呢? 'break' 是____,而不是值。以上是关于为啥 return 0 或 break 不能与逗号运算符一起使用?的主要内容,如果未能解决你的问题,请参考以下文章