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

Sri*_*ian 2 c++ comma-operator

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

if (! AddToList(obj1, (unsigned int) Val), CATEGORY_1)
{
    break;
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 7

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

!AddToList(obj1, (unsigned int) Val) , CATEGORY_1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^
First expression                       Second expression
Run Code Online (Sandbox Code Playgroud)

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