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

Why this code compiles in VS? ("extra" comma)

本文关键字:编译 逗号 extra 段代码 代码 为什么 VS      更新时间:2023-10-16

下面一行在for循环中。如果方法失败,则需要中断它。CATEGORY_1是一个enum。我添加了这个enum作为AddToList方法的一个新参数,它有一个默认值。如果你仔细看下面,我实际上犯了一个错误,把逗号和enum放在函数的参数列表外面。这在VS2010中编译得很好。因此,我很难发现传递给该参数的是默认值,而不是CATEGORY_1。有人知道为什么会成功吗?

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

在c++中,逗号不仅仅是一个分隔符;它也可以是一个算子。那个逗号是一个运算符。逗号操作符计算第一个表达式,放弃结果,然后计算第二个表达式并生成其结果。

!AddToList(obj1, (unsigned int) Val) , CATEGORY_1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^
First expression                       Second expression
当然,像大多数其他操作符一样,逗号操作符可以被重载,如果在这里使用重载,则语义可能会有所不同。这是内置逗号操作符的行为[/p>

逗号操作符将简单地放弃第一个表达式的结果,并计算第二个表达式的值。在这种情况下,如果bool(CATEGORY_1) == true那么if永远不会求值;相反,如果是bool(CATEGORY_1) == false,那么if总是可以求值的。在这两种情况下,AddToList返回什么都无关紧要。