这(注意逗号操作符):
#include <iostream>
int main() {
int x;
x = 2, 3;
std::cout << x << "n";
return 0;
}
2 <<p>输出strong> 。但是,如果您将return
与逗号操作符一起使用,则:
#include <iostream>
int f() { return 2, 3; }
int main() {
int x;
x = f();
std::cout << x << "n";
return 0;
}
<<p>输出strong> 3 。为什么逗号操作符与return
的行为不同?
根据运算符优先级,逗号运算符的优先级低于operator=
,因此x = 2,3;
相当于(x = 2),3;
。(操作符优先级决定了操作符将如何绑定到其参数,根据其优先级,比其他操作符更紧或更松。)
注意这里的逗号表达式是(x = 2),3
,而不是2,3
。首先计算x = 2
(并完成其副作用),然后丢弃结果,然后计算3
(实际上它什么都不做)。因此x
的值为2
。注意,3
是整个逗号表达式(即x = 2,3
)的结果,它不会被用来分配给x
。(将其更改为x = (2,3);
, x
将与3
一起分配)
对于return 2,3;
,逗号表达式为2,3
,对2
求值,然后将其结果丢弃,然后对3
求值,并将其作为整个逗号表达式的结果返回,该结果稍后由return语句返回。
表达式和语句的附加信息
表达式是指定计算的操作符及其操作数的序列。
x = 2,3;
是表达式语句,x = 2,3
是这里的表达式。
带分号的表达式是一条语句。
语法:
attr(optional) expression(optional) ; (1)
return 2,3;
是跳转语句(返回语句),2,3
是这里的表达式。
语法:
attr(optional) return expression(optional) ; (1)
逗号(也称为表达式分隔)操作符从左到右求值。所以return 2,3;
等于return 3;
。
由于运算符优先级, x = 2,3;
的求值为(x = 2), 3;
。计算仍然是从左到右,整个表达式的值为3,副作用是x
假设值为2。
语句:
x = 2,3;
由两个表达式组成:
> x = 2
> 3
由于运算符优先级,=
的优先级比逗号,
高,因此计算x = 2
,并在 3
之后计算。那么x
将等于2
。
在return
中改为:
int f(){ return 2,3; }
语言语法为:
return <expression>
注意 return
不是表达式的一部分。
那么在这种情况下,两个表达式将被求值为
> 2
> 3
但是只有第二个(3
)将被返回。
尝试使用简单的方法,只是用括号突出显示优先级:
( x = 2 ), 3;
return ( 2, 3 );
现在我们可以看到二进制运算符","从左到右以相同的方式在两个对象上工作