C++ 中逗号运算符与 return 的不同行为?

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

这个(注意 逗号运算符):

#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 Precedence, comma operator 的优先级低于 operator=,因此 x = 2,3; 等同于 (x = 2),3;。 (运算符优先级决定了运算符如何绑定到它的参数,根据它们的优先级比其他运算符更紧或更松散。)

注意这里的逗号表达式是(x = 2),3,而不是2,3x = 2 首先求值(它的副作用已经完成),然后丢弃结果,然后 3 求值(实际上什么都不做)。这就是 x 的值为 2 的原因。请注意,3 是整个逗号表达式(即 x = 2,3)的结果,不会用于分配给 x。 (改成x = (2,3);x会赋值为3。)

对于return 2,3;,逗号表达式为2,3,对2进行求值然后丢弃其结果,然后对3进行求值并作为结果返回return statement 稍后返回的整个逗号表达式。


有关 Expressions and Statements

的其他信息

An expression is a sequence of operators and their operands, that specifies a computation.

x = 2,3;就是expression statementx = 2,3就是这里的表达式。

An expression followed by a semicolon is a statement.

Syntax: attr(optional) expression(optional) ; (1)

return 2,3;跳转语句(return statement),2,3是这里的表达式

Syntax: attr(optional) return expression(optional) ; (1)

逗号(也称为表达式分隔符)运算符从左到右求值。所以 return 2,3; 等同于 return 3;.

由于运算符优先级x = 2,3; 的计算结果为(x = 2), 3;。计算仍然是从左到右,entire 表达式的值为 3,x 的副作用假设值为 2.

这条语句:

  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)。

尝试应用简单的方法,只是用括号突出显示优先级:

( x = 2 ), 3;

return ( 2, 3 );

现在我们可以看到二元运算符“,”从左到右以相同的方式在两者上工作。