C / C ++逗号运算符让我很困惑。语言律师?

时间:2012-10-04 17:22:46

标签: c++ visual-c++

我在Boost文档的一个例子中看到了这段代码:

std::vector<int> input;
input += 1,2,3,4,5,6,7,8,9;
多可爱啊Boost有一个operator + =的模板,它利用了逗号在大多数情况下是一个操作符的事实。 (明智的是,C ++不允许黑客超载&#34; 运算符,&#34;。)

我也喜欢编写可爱的代码,所以我用逗号操作符玩了一些。我找到了一些看起来很奇怪的东西。您认为以下代码将如何打印?

#include <iostream>
int main() {
    int i;
    i = 1,2;
    std::cout << i << ' ';
    i = (1,2);
    std::cout << i << std::endl;
}
你猜对了。 VC ++ 2012打印&#34; 1,2&#34;。那是什么?

[编辑:我应该更精确。应该说C ++不允许运营商&#34;,&#34;在要重载的int列表中。或者更好,没什么。 &#39;,&#39;可以为类和枚举重载运算符。]

2 个答案:

答案 0 :(得分:13)

案例1:

i = 1,2;

=的优先级高于,

因此,1被分配给i

由于作业评估为lvalue中的c++(评估为rvalue中的c),因此评分为i,2的{​​{1}} (参见注释)

案例2:

2

i = (1,2);的优先级高于()

=运算符分隔的

expressionsoperands评估为上一个,expression的值,因此operand被分配给2


注意

从{strong>从左到右i comma expression进行评估。

此类逗号表达式的结果是最右侧表达式的值。

实施例

33,77,x,y,z

答案 1 :(得分:5)

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

i = 1,2;

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

i = (1,2);

(1,2)的结果是2。

编辑:这可能是像

这样的事情
for (i=0, j=0; ...)

按预期工作。