在C ++中的逗号运算符的不同行为与返回?

这(注意逗号运算符 ):

#include <iostream> int main() { int x; x = 2, 3; std::cout << x << "\n"; return 0; } 

输出2

但是,如果您使用逗号运算符return ,则:

 #include <iostream> int f() { return 2, 3; } int main() { int x; x = f(); std::cout << x << "\n"; return 0; } 

输出3

为什么逗号运算符的行为与return有所不同?

根据运算符优先级 , 逗号运算符优先于operator= ,所以x = 2,3; 相当于(x = 2),3; 。 (运算符的优先级决定运算符如何绑定到它的参数上,比其他运算符根据它们的优先级更紧凑或更松散。)

注意逗号expression式是(x = 2),3这里是(x = 2),3 ,而不是2,3 。 首先计算x = 2 (并且其副作用已经完成),然后丢弃结果,然后评估3 (实际上什么也不做)。 这就是为什么x的值是2 。 请注意, 3是整个逗号expression式(即x = 2,3 )的结果,它不会被用来分配给x 。 (将其更改为x = (2,3); x将被分配为3

为了return 2,3; ,逗号expression式为2,3求值,然后丢弃其结果,然后返回3 ,作为整个逗号expression式的结果,后面是return语句返回的结果。


有关expression式和语句的其他信息

expression式是一系列运算符及其操作数,指定一个计算。

x = 2,3; 是expression式语句 , x = 2,3是这里的expression式。

一个expression式后跟一个分号是一个语句。

语法: attr(optional) expression(optional) ; (1) attr(optional) expression(optional) ; (1)

return 2,3; 是跳转语句 ( return语句 ), 2,3是这里的expression式。

语法: attr(optional) return expression(optional) ; (1) attr(optional) return expression(optional) ; (1)

逗号(也称为expression式分隔 )运算符从左到右进行评估。 所以return 2,3; 相当于return 3;

评估x = 2,3;(x = 2), 3; 由于运营商的优先权 。 评估仍然是从左到右, 整个expression式的值为3, x的副作用为2。

这个说法:

  x = 2,3; 

由两个expression式组成:

 > x = 2 > 3 

由于运算符优先级 , =比逗号优先级高,所以x = 2被评估,并且 3 之后 。 那么x将等于2


return而不是:

 int f(){ return 2,3; } 

语言语法是:

 return <expression> 

注意 return不是expression式的一部分。

所以在这种情况下,这两个expression式将被评估为:

 > 2 > 3 

但是只有第二个( 3 )将被返回。

尝试应用简单的方法,只是突出括号的优先顺序:

( x = 2 ), 3;

return ( 2, 3 );

现在我们可以看到二元运算符“,”从左到右都以相同的方式工作。

    Interesting Posts