非布尔的短路

Irf*_*rfy 10 c c++

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

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

第二个表达式将评估为10.

引用C11标准草案:

6.5.14逻辑OR运算符

  1. ||操作人员应得到1如果任一操作数的比较不等于0; 否则,它产生0.结果有类型int.

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

编辑:

其中一条评论声称这个答案仅适用于c,并且Orbit中的@Lightness Races 是正确的.

还有一些答案只适用于c ++ 1,尽管与它们唯一不同的是c ++具有类型bool,然后它将此表达式计算为bool而不是int.但显然||在c ++中重载运算符存在一个重要问题,它可以避免短时间应用于重载它的对象.

所以对于c ++来说还有更多的事情要考虑,但由于这个问题用两种语言标签标记,所以至少要提到差异.

的规则仍然适用时短路适用,即,表达式求值的结果是任一10为c和truefalse用于C++.


1像这些问题的答案:1,2

  • 对你的答案进行编辑是没有意义的,我认为因为你错误地引用了@LightnessRacesinOrbit声称答案只在C++中有效(这使得第二段似乎令人困惑和矛盾).此外,我没有看到YouTube火焰诱饵的链接点声称C和C++应该是一种语言. (2认同)
  • @jadarnel27:它也有误导/错误,因为它表明C和C++之间的唯一区别是表达式的类型,实际上,短路 - 表面上是这个问题的重点 - 只适用于内置布尔运算符.[一旦你超载它们,C++功能就会消失](http://stackoverflow.com/a/628554/560648).否则我可能不会打扰评论.因此,答案仍然是错误的.也就是说,尽管有这个标题,但很难看出短路问题在哪里适合这个问题. (2认同)

Sam*_*nen 5

关于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输出.