【问题标题】:Can someone explain this C++ comma operator short-circuiting example?有人可以解释这个 C++ 逗号运算符短路示例吗?
【发布时间】:2011-08-18 03:36:12
【问题描述】:

有人能解释一下这个 C++ 逗号运算符短路示例吗?

bIsTRUE     = true, false, true;
bIsFALSE    = (true, false), true;
bIsAlsoTRUE = ((true, false), true);

为什么第二个版本短路并返回false(至少在MSVC++中),而其他两个版本却不返回true

【问题讨论】:

    标签: c++ boolean operators short-circuiting comma-operator


    【解决方案1】:

    逗号运算符的优先级低于赋值,所以这些被解析为

    (bIsTRUE     = true), false, true;     
    (bIsFALSE    = (true, false)), true;   
    (bIsAlsoTRUE = ((true, false), true)); 
    

    逗号运算符不会短路。它计算左操作数,忽略结果,然后计算右操作数。

    bIsTRUEtrue,因为赋值的右操作数是 true

    bIsFALSEfalse,因为(true, false) 评估true,忽略结果,然后评估并产生false

    bIsAlsoTRUEtrue,因为((true, false), true) 评估(true, false),忽略结果,然后评估并产生true

    【讨论】:

    • 啊,加括号说明一切的情况!
    • 只是出于好奇,您会在哪里使用此类功能?
    • @PeterR.: 哪个功能,逗号的优先级低于赋值? int count = 0; for (Node *p = head; p; p = p->next, ++count) {} 一个糟糕的例子,但是 for 循环增量表达式,有时还有其他类似的东西,可以使用它。
    • @Fred 是的!我实际上从未注意到我使用过它!谢谢:)
    • @Adisak:与所有运算符重载一样,至少有一个操作数类型必须是类或枚举类型。因此,您可以重载 MyClassint 的运算符(以便能够使用 MyClass, 42),但不能重载 intint (42, 42)。
    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 2018-03-03
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    相关资源
    最近更新 更多