非布尔的短路

时间:2015-06-03 13:22:26

标签: c++ c

缩短三元运算符的使用是否安全:

process_ptr(ptr ? ptr : default_ptr);

短路:

process_ptr(ptr || default_ptr);
在C和C ++中

?换句话说,我们是否保证从表达式中获取 ptr default_ptr,或者是否允许表达式结果在任意“逻辑真”值中,如果表达式在逻辑上是真的吗?

这是你在Perl代码中看到的那种代码,但我很少在C / C ++中看到它,这是我问题的原始基础。

4 个答案:

答案 0 :(得分:11)

第二个表达式将评估为10

引用C11标准草案:

  

6.5.14逻辑OR运算符

     
      
  1. ||运算符如果其任一操作数比较不等于0,则应得1;否则,它会产生0.结果的类型为int
  2.   

所以这两个表达式是非常不同的,因为其中一个表达式产生指针,另一个表达式为整数。

修改

其中一条评论声称此答案仅适用于c,@ Lightness Races in Orbit是正确的。

还有一些答案只适用于c ++ 1 ,尽管与它们唯一不同的是c ++具有类型bool,然后它将此表达式计算为bool而不是int。但是apparently there is an important issue with overloading || operator in c++,它会对重载它的对象的应用进行短暂的限制。

因此,对于c ++,还有更多的事情需要考虑,但由于这个问题都标有两种语言标签,因此至少需要提及差异。

当短路适用时,该规则仍然适用,即对于c和10,表达式的评估结果为truefalse C ++。

1 喜欢这些答案:12

答案 1 :(得分:5)

关于Perl样式,通常是

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

这也适用于C ++。

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

这是由于||是一个逻辑OR运算符,并且如果返回值为真,则导致此情况下的短路。

但是使用它而不是三元运算符是不可能的。

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

这将导致输出1

答案 2 :(得分:3)

没有。结果类型为int(或C ++中的bool),在C ++中为10truefalse

答案 3 :(得分:3)

指针的

operator||会返回bool,因此如果ptr || default_ptrtrue为非空,ptr将评估为default_ptr