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

时间:2016-09-07 07:56:31

标签: c++ return language-lawyer operator-precedence comma-operator

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

#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的行为不同?

4 个答案:

答案 0 :(得分:135)

根据Operator Precedencecomma 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,32被计算,然后其结果被丢弃,然后3被评估并作为整体的结果返回逗号表达式,稍后由return statement返回。

有关ExpressionsStatements

的其他信息
  

表达式是一系列运算符及其操作数,用于指定计算。

x = 2,3;expression statementx = 2,3是此处的表达。

  

后跟分号的表达式是一个语句。

     

语法:attr(optional) expression(optional) ; (1)

return 2,3;jump statementreturn 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 = 23之后。然后x将等于2

改为return

int f(){ return 2,3; }

语言语法为:

return <expression>

注意 return不是表达式的一部分。

因此,在这种情况下,将评估两个表达式:

> 2
> 3

但只返回第二个(3)。

答案 3 :(得分:2)

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

( x = 2 ), 3;

return ( 2, 3 );

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