缩短三元运算符的使用是否安全:
process_ptr(ptr ? ptr : default_ptr);
Run Code Online (Sandbox Code Playgroud)
与短路:
process_ptr(ptr || default_ptr);
Run Code Online (Sandbox Code Playgroud)
在C和C++?换句话说,是我们保证让无论是 ptr 或 default_ptr从表达研究背部,或者是它可能允许表达导致任意"逻辑真"值,如果表达式是逻辑真?
这是你在Perl代码中看到的那种代码,但我很少在C/C++中看到它,这是我问题的原始基础.
Iha*_*imi 11
第二个表达式将评估为1或0.
引用C11标准草案:
6.5.14逻辑OR运算符
- 该
||操作人员应得到1如果任一操作数的比较不等于0; 否则,它产生0.结果有类型int.
所以这两个表达式是非常不同的,因为其中一个表达式产生指针,另一个表达式产生一个整数.
编辑:
其中一条评论声称这个答案仅适用于c,并且Orbit中的@Lightness Races 是正确的.
还有一些答案只适用于c ++ 1,尽管与它们唯一不同的是c ++具有类型bool,然后它将此表达式计算为bool而不是int.但显然||在c ++中重载运算符存在一个重要问题,它可以避免短时间应用于重载它的对象.
所以对于c ++来说还有更多的事情要考虑,但由于这个问题用两种语言标签标记,所以至少要提到差异.
的规则仍然适用时短路适用,即,表达式求值的结果是任一1或0为c和true或false用于C++.
关于Perl风格,通常是类型
do_someting || die("didn't work")
Run Code Online (Sandbox Code Playgroud)
这也适用于C++.
function_returning_bool(some) || std::cout << "Error!" << std::endl;
Run Code Online (Sandbox Code Playgroud)
这是因为||它是逻辑OR运算符,并且如果返回值为真,则在这种情况下导致短路.
但是使用它而不是三元运算符是不可能的.
std::cout << ("asd" || "dsa");
Run Code Online (Sandbox Code Playgroud)
这将导致1输出.