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,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 稍后返回的整个逗号表达式。
有关 Expressions and Statements
的其他信息
An expression is a sequence of operators and their operands, that specifies a computation.
x = 2,3;
就是expression statement,x = 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 );
现在我们可以看到二元运算符“,”从左到右以相同的方式在两者上工作。
这个(注意 逗号运算符):
#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,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 稍后返回的整个逗号表达式。
有关 Expressions and Statements
的其他信息An expression is a sequence of operators and their operands, that specifies a computation.
x = 2,3;
就是expression statement,x = 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 );
现在我们可以看到二元运算符“,”从左到右以相同的方式在两者上工作。