C++中 'int x = (anyInt1, anyInt2);' 的含义是什么?

6
今天我发现下面的代码可以通过gcc编译:

可能是重复问题:
为什么 3,758,096,384 << 1 的结果是 768?

#include <iostream>

int main()
{
    int x = (23,34);

    std::cout << x << std::endl; // prints 34

    return 0;
}

为什么这个可以编译通过?(..., ...)的意义是什么?

1
当然,真正的意思是有些聪明的人使用了逗号运算符,这很少被证明是合理的。 - Yakk - Adam Nevraumont
2个回答

14

在一个表达式中,逗号操作符将计算它的所有操作数并返回最后一个。这就是为什么在你的例子中,x 等于 34 的原因。


而括号就像在if语句中使用的一样,用于分组语句。 - mrbrdo
啊,是的。我忘记 C++ 中有逗号操作符了。谢谢。 - pwks

8
在C++中,,是一个运算符,因此(23,34)就像(23+34)一样是一个表达式。在前者中,,是一个运算符,而在后者中,+是一个运算符。
所以表达式(23,34)的值为最右边的操作数,即34,这就是为什么您的代码输出34的原因。
我还想提到的是,在函数调用中,,不是一个运算符:
int m = max(a,b);

这里的,充当参数分隔符,而不是运算符。因此你需要将两个参数传递给函数。
然而,
int m = max((a,b), c);

这里的第一个,是操作符,第二个,是分隔符。因此,您仍然向函数传递两个参数,而不是三个,并且等价于以下内容:

int m = max(b, c); //as (a,b) evaluates to b

希望这有所帮助。:-)

3
在这个例子中,括号的作用是提醒我们逗号的优先级比赋值运算符低。如果没有括号,代码 int x = 23,34; 将无法编译通过。请注意,括号只起到提示作用,不改变原来的意思。 - Tomek
@Tomek:好观点。谢谢。希望读者也能看到你的评论。 - Nawaz
1
这同样适用于C。 - Jörgen Sigvardsson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接