非布尔值的短路
Short-circuiting of non-booleans
缩短三元操作符的用法是否安全:
process_ptr(ptr ? ptr : default_ptr);
与短路:
process_ptr(ptr || default_ptr);
在C和c++ ?换句话说,我们是否保证从表达式返回 ptr
或 default_ptr
,或者如果表达式在逻辑上为真,是否允许表达式产生任意的"逻辑真"值?
这种代码在Perl代码中随处可见,但我很少在C/c++中看到它,这是我问题的最初基础。
第二个表达式将求值为1
或0
。
引用C11标准草案:
6.5.14逻辑或运算符
- 如果
||
运算符的任何一个操作数比较不等于0,则返回1;否则,它的结果是0。结果类型为int
。
所以这两个表达式是非常不同的,因为其中一个产生指针,而另一个产生整数。
编辑:
其中一条评论声称这个答案只对c有效,而@Lightness Races in Orbit是正确的。
也有只对c++1正确的答案,尽管与它们唯一的区别是c++具有类型bool
,然后它将此表达式计算为bool
而不是int
。但显然,c++中重载||
操作符有一个重要的问题,它防止短路到对重载它的对象应用。
所以对于c++来说,有更多的事情要考虑,但是由于这个问题是用两种语言标记的,那么有必要至少提到它们的区别。
当发生短路时,规则仍然适用,即表达式的求值结果对于c是1
或0
,对于c++是true
或false
。
<一口> 共舞,像这些答案: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
),或者为1
或0
(c++中为true
或false
)。
operator||
对于指针返回bool
,因此如果ptr
或default_ptr
非空,ptr || default_ptr
将求值为true
。
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 重载更少,则运算符返回相反的布尔值
- 将此布尔值传递给此函数的最有效方法是什么?
- 如何设置 c++ 类的布尔值?
- 使用 MAKEWORD / MAKEWPARAM 使用布尔值而不是布尔值
- 将 10 个线程与原子布尔值同步
- 创建类似于布尔值的变量类型
- 布尔值向量的基于范围 for 循环
- 零点和布尔值之间的比较
- 简化对两个布尔值的 4 个 if/else 检查
- 无法创建带有布尔值和矢量的地图
- 对于完成布尔值设置为 true 后未停止的循环
- fstream / ifstream / ofstream 对象如何转换为布尔值
- C++:将值赋值给原始数据类型(例如布尔值)是原子操作吗?
- 为什么布尔值不能比作最后一点?
- 如何使用返回布尔值的函数?
- 非布尔值的短路
- 非惰性/短路布尔运算符,强制对两个参数进行求值