【问题标题】:Why this code compiles in VS? ("extra" comma)为什么这段代码在 VS 中编译? (“额外”逗号)
【发布时间】:2011-04-12 01:38:16
【问题描述】:

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

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

【问题讨论】:

    标签: c++ comma-operator


    【解决方案1】:

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

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

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

    【讨论】:

    • 是否会应用 not 运算符?
    • 明确一点,James 指的第一个表达式是!AddToList(obj1, (unsigned int) Val),第二个表达式是CATEGORY_1
    • @Sriram Subramanian :不,逗号运算符是所有运算符中最低的运算符。因此,not 将适用于 AddToList,而不适用于 CATEGORY_1
    • @Sriram:是的,! 被评估了,但它没有任何意义,因为结果被丢弃了。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-06
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多