如果您有以下内容:
if (x)
{
y = *x;
}
else
{
y = 0;
}
然后保证定义行为,因为我们只能取消引用x
如果它不是0
同样可以说:
y = (x) ? *x : 0;
这似乎按预期工作(甚至在g ++上用-Wpedantic
编译)
这有保证吗?
答案 0 :(得分:15)
是的,只评估第二个或第三个操作数,草案C ++标准部分5.16
[expr.cond] 表示:
条件表达式从右到左分组。第一个表达式在上下文中转换为bool(第4条)。 它被评估,如果是,则条件表达式的结果是第二个表达式的值, 否则第三个表达。 仅评估第二个和第三个表达式中的一个。每个值 在每次值计算之前,对与第一表达式相关联的计算和副作用进行排序 与第二或第三种表达相关的副作用。