非布尔值的短路

Short-circuiting of non-booleans

本文关键字:短路 布尔值      更新时间:2023-10-16

缩短三元操作符的用法是否安全:

process_ptr(ptr ? ptr : default_ptr);

与短路:

process_ptr(ptr || default_ptr);

在C和c++ ?换句话说,我们是否保证从表达式返回 ptr default_ptr,或者如果表达式在逻辑上为真,是否允许表达式产生任意的"逻辑真"值?

这种代码在Perl代码中随处可见,但我很少在C/c++中看到它,这是我问题的最初基础。

第二个表达式将求值为10

引用C11标准草案:

6.5.14逻辑或运算符
  • 如果||运算符的任何一个操作数比较不等于0,则返回1;否则,它的结果是0。结果类型为int
  • 所以这两个表达式是非常不同的,因为其中一个产生指针,而另一个产生整数。

    编辑:

    其中一条评论声称这个答案只对c有效,而@Lightness Races in Orbit是正确的。

    也有只对c++1正确的答案,尽管与它们唯一的区别是c++具有类型bool,然后它将此表达式计算为bool而不是int。但显然,c++中重载||操作符有一个重要的问题,它防止短路到对重载它的对象应用

    所以对于c++来说,有更多的事情要考虑,但是由于这个问题是用两种语言标记的,那么有必要至少提到它们的区别。

    当发生短路时,规则仍然适用,即表达式的求值结果对于c是10,对于c++是truefalse


    <一口> 共舞,像这些答案:1 1 2

    关于Perl样式,它通常是类型

    do_someting || die("didn't work")
    

    这也适用于c++。

    function_returning_bool(some) || std::cout << "Error!" << std::endl;
    

    这是由于||是一个逻辑或运算符,在这种情况下,如果返回值为真,则会导致短路。

    但是用它来代替三元操作符是不可能的。

    std::cout << ("asd" || "dsa");
    

    这将导致1输出

    No。结果类型为int (c++中为bool),或者为10 (c++中为truefalse)。

    operator||对于指针返回bool,因此如果ptrdefault_ptr非空,ptr || default_ptr将求值为true