缩短三元运算符的使用是否安全:
process_ptr(ptr ? ptr : default_ptr);
短路:
process_ptr(ptr || default_ptr);
在C和C ++中?换句话说,我们是否保证从表达式中获取 ptr
或 default_ptr
,或者是否允许表达式结果在任意“逻辑真”值中,如果表达式在逻辑上是真的吗?
这是你在Perl代码中看到的那种代码,但我很少在C / C ++中看到它,这是我问题的原始基础。
答案 0 :(得分:11)
第二个表达式将评估为1
或0
。
引用C11标准草案:
6.5.14逻辑OR运算符
- 醇>
||
运算符如果其任一操作数比较不等于0,则应得1;否则,它会产生0.结果的类型为int
。
所以这两个表达式是非常不同的,因为其中一个表达式产生指针,另一个表达式为整数。
修改强>:
其中一条评论声称此答案仅适用于c,@ Lightness Races in Orbit是正确的。
还有一些答案只适用于c ++ 1 ,尽管与它们唯一不同的是c ++具有类型bool
,然后它将此表达式计算为bool
而不是int
。但是apparently there is an important issue with overloading ||
operator in c++,它会对重载它的对象的应用进行短暂的限制。
因此,对于c ++,还有更多的事情需要考虑,但由于这个问题都标有两种语言标签,因此至少需要提及差异。
当短路适用时,该规则仍然适用,即对于c和1
或0
,表达式的评估结果为true
或false
C ++。
答案 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 ++中为1
或0
(true
或false
)
答案 3 :(得分:3)
operator||
会返回bool
,因此如果ptr || default_ptr
或true
为非空,ptr
将评估为default_ptr
。