Pre-C ++ 11我们知道运营商&&
需要短路和评估顺序,因为:
1.9.18
评估以下表达式
a && b a || b a ? b : c a , b
使用这些表达式中运算符的内置含义,在评估第一个表达式后有一个序列点(12)。
但是C ++ 11中不再存在序列点,所以标准部分在哪里说:
if (ptr && ptr->do_something())
{
}
安全吗?
答案 0 :(得分:14)
[expr.log.and]
&&
运算符组从左到右。操作数都在上下文中转换为bool
(第4条)。 如果两个操作数都为真,则结果为true,否则为false。与&
不同,&&
保证从左到右 评估:如果第一个操作数为false,则不评估第二个操作数。结果是
bool
。如果计算第二个表达式,则每个值计算和副作用相关联 第一个表达式在每个值计算和与之相关的副作用之前进行排序 第二个表达。