为什么这段代码在VS中编译? (“额外”逗号)

时间:2011-04-12 01:38:16

标签: c++ comma-operator

下面的行在for循环中。如果方法失败,则需要中断。 CATEGORY_1是一个枚举。我将此枚举添加为AddToList方法的新参数,并带有默认值。如果你仔细看下面,我实际上错误地把逗号和枚举放在函数的参数列表之外。这与VS2010完美匹配。所以我很难找到为该参数而不是CATEGORY_1传递的默认值。 有谁知道为什么会成功?

if (! AddToList(obj1, (unsigned int) Val), CATEGORY_1)
{
    break;
}

2 个答案:

答案 0 :(得分:7)

在C ++中,逗号不仅仅是一个分隔符;它也可以是一个运营商。那个逗号是一个运算符。逗号运算符计算第一个表达式,丢弃结果,然后计算第二个表达式并生成结果。

!AddToList(obj1, (unsigned int) Val) , CATEGORY_1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^
First expression                       Second expression

[当然,逗号运算符与大多数其他运算符一样,可以重载,如果在这里使用重载,则语义可能不同。这是内置逗号运算符的行为。]

答案 1 :(得分:1)

逗号运算符将简单地丢弃第一个表达式的结果并计算第二个表达式的值。所以在这种情况下,如果bool(CATEGORY_1) == true那么if永远不会评估;相反,如果bool(CATEGORY_1) == false,那么if将始终评估。在任何情况下,AddToList返回的内容都无关紧要。