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