9

我在 Boost 文档的示例中遇到了这段代码:

std::vector<int> input;
input += 1,2,3,4,5,6,7,8,9;

真可爱。Boost 有一个 operator+= 模板,它利用了逗号在大多数情况下是一个运算符这一事实。(明智地,C++ 不允许黑客重载“运算符”。)

我也喜欢写可爱的代码,所以我用逗号操作符玩了一些。我发现了一些对我来说很奇怪的东西。你认为下面的代码会打印什么?

#include <iostream>
int main() {
    int i;
    i = 1,2;
    std::cout << i << ' ';
    i = (1,2);
    std::cout << i << std::endl;
}

你猜对了。VC++ 2012 打印“1, 2”。那是怎么回事?

[编辑:我应该更准确。应该说 C++ 不允许重载 int 列表中的运算符“,”。或者更好的是,什么都没有。',' 运算符可以为类和枚举重载。]

4

2 回答 2

14

情况1:

i = 1,2;

=优先级高于,

因此,1被分配给i

由于 assignment 评估为lvaluein c++,(评估为rvaluein c)它变成i,2which 评估为2(请参阅 NOTE)

案例二:

i = (1,2);

()优先级高于=

expressionsoperands,运算符分隔评估为最后一个的值,expressionoperand因此2分配给i


笔记

a comma expressionlike33,77,x,y,z从左到右评估的。

这种逗号表达式的结果是最右边表达式的值。

例子

Consider, int z=100; 
then
1,4,5; //evaluates to 5
1,100,z+100; //evaluates to 200
于 2012-10-04T17:26:22.837 回答
5

简单:“=”具有更高的优先级。

i = 1,2;

就像 (i=1),2,表示表达式的结果是 2 但它被丢弃了。

i = (1,2);

(1,2) 的结果是 2。

编辑:这可能是这样的

for (i=0, j=0; ...)

按预期工作。

于 2012-10-04T17:25:56.317 回答