ps9*_*s95 80 c++ return operator-precedence comma-operator language-lawyer
这个(注意逗号运算符):
#include <iostream>
int main() {
int x;
x = 2, 3;
std::cout << x << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出2.
但是,如果您使用return逗号运算符,则:
#include <iostream>
int f() { return 2, 3; }
int main() {
int x;
x = f();
std::cout << x << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出3.
为什么逗号运算符的行为与return?
son*_*yao 138
根据运算符优先级,逗号运算符的优先级低于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被评估并返回作为整个逗号表达,这是由所返回的结果返回语句以后.
表达式是一系列运算符及其操作数,用于指定计算.
x = 2,3;是表达式语句,x = 2,3是这里的表达式.
后跟分号的表达式是一个语句.
句法:
attr(optional) expression(optional) ; (1)
return 2,3;是jump语句(return语句),2,3是这里的表达式.
句法:
attr(optional) return expression(optional) ; (1)
Bat*_*eba 32
从左到右评估逗号(也称为表达式分隔)运算符.所以return 2,3;相当于return 3;.
评估x = 2,3;是(x = 2), 3;由于运营商的优先权.评估仍然是从左到右,整个表达式的值为3,其副作用是x假设值为2.
Bia*_*sta 19
这个说法:
x = 2,3;
Run Code Online (Sandbox Code Playgroud)
由两个表达式组成:
> x = 2
> 3
Run Code Online (Sandbox Code Playgroud)
由于运算符优先级,
=具有比逗号更多的优先级,,因此x = 2被评估和之后 3.那就x等于了2.
在return改为:
int f(){ return 2,3; }
Run Code Online (Sandbox Code Playgroud)
语言语法是:
return <expression>
Run Code Online (Sandbox Code Playgroud)
注意 return不是表达的一部分.
所以在这种情况下,将评估两个表达式:
> 2
> 3
Run Code Online (Sandbox Code Playgroud)
但只3返回第二个().