c++中逗号操作符与return的不同行为

Different behaviour of comma operator in C++ with return?

本文关键字:return 操作符 c++      更新时间:2023-10-16

这(注意逗号操作符):

#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 );

现在我们可以看到二进制运算符","从左到右以相同的方式在两个对象上工作