我在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;可以为类和枚举重载运算符。]
答案 0 :(得分:13)
案例1:
i = 1,2;
=
的优先级高于,
因此,1
被分配给i
。
由于作业评估为lvalue
中的c++
(评估为rvalue
中的c
),因此评分为i,2
的{{1}} (参见注释)
案例2:
2
i = (1,2);
的优先级高于()
=
运算符分隔的 expressions
或operands
评估为上一个,
或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; ...)
按预期工作。