这(请注意逗号运算符):
#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
的行为不同?
答案 0 :(得分:135)
根据Operator Precedence,comma operator的优先级低于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 statement返回。
表达式是一系列运算符及其操作数,用于指定计算。
x = 2,3;
是expression statement,x = 2,3
是此处的表达。
后跟分号的表达式是一个语句。
语法:
attr(optional) expression(optional) ; (1)
return 2,3;
是jump statement(return statement),2,3
就是这里的表达。
语法:
attr(optional) return expression(optional) ; (1)
答案 1 :(得分:32)
从左到右计算逗号(也称为表达式分离)运算符。因此return 2,3;
相当于return 3;
。
由于运算符优先级,对x = 2,3;
的评估为(x = 2), 3;
。评估仍然是从左到右,整个表达式的值为3,副作用为x
,假设值为2.
答案 2 :(得分:19)
本声明:
x = 2,3;
由两个表达式组成:
> x = 2
> 3
自operator precedence以来,
=
的优先级高于逗号,
,因此评估x = 2
, 3
之后。然后x
将等于2
。
改为return
:
int f(){ return 2,3; }
语言语法为:
return <expression>
注意 return
不是表达式的一部分。
因此,在这种情况下,将评估两个表达式:
> 2
> 3
但只返回第二个(3
)。
答案 3 :(得分:2)
尝试应用简单的方法,只是用括号突出显示优先级:
( x = 2 ), 3;
return ( 2, 3 );
现在我们可以看到二元运算符“,”从左到右以相同的方式工作。