在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 );
现在我们可以看到二元运算符“,”从左到右都以相同的方式工作。