三元运算符是否以确定的方式短路

时间:2015-10-29 14:47:44

标签: c++ undefined-behavior conditional-operator short-circuiting

如果您有以下内容:

if (x)
{
    y = *x;
}
else
{
    y = 0;
}

然后保证定义行为,因为我们只能取消引用x如果它不是0

同样可以说:

y = (x) ? *x : 0;

这似乎按预期工作(甚至在g ++上用-Wpedantic编译)

这有保证吗?

1 个答案:

答案 0 :(得分:15)

是的,只评估第二个或第三个操作数,草案C ++标准部分5.16 [expr.cond] 表示:

  

条件表达式从右到左分组。第一个表达式在上下文中转换为bool(第4条)。   它被评估,如果是,则条件表达式的结果是第二个表达式的值,   否则第三个表达。 仅评估第二个和第三个表达式中的一个。每个值   在每次值计算之前,对与第一表达式相关联的计算和副作用进行排序   与第二或第三种表达相关的副作用。