三元运算符是不是以定义的方式短路
Posted
技术标签:
【中文标题】三元运算符是不是以定义的方式短路【英文标题】:Does the ternary operator short circuit in a defined way三元运算符是否以定义的方式短路 【发布时间】:2016-01-29 18:48:51 【问题描述】:如果您有以下情况:
if (x)
y = *x;
else
y = 0;
那么就保证定义了行为,因为我们只能取消引用x
,如果它不是0
也可以这样说:
y = (x) ? *x : 0;
这似乎按预期工作(即使在 g++ 上使用 -Wpedantic
编译)
这是有保证的吗?
【问题讨论】:
是的 - 三元运算符只是语法糖 是的。 (太短,无法作为答案发布)。 三元表达式中没有“短路”。并且它不会在条件被完全评估之前过早地评估或执行任何分支。 @EdHeal 我想不出它会是什么语法糖。 @EdHeal 但是条件运算符给你一个表达式,而不是一个语句。 【参考方案1】:是的,只会计算第二个或第三个操作数,C++ 标准草案草案5.16
[expr.cond] 说:
条件表达式从右到左分组。第一个表达式根据上下文转换为 bool(第 4 条)。 它被评估,如果为真,则条件表达式的结果是第二个表达式的值, 否则是第三个表达式。 仅计算第二个和第三个表达式中的一个。 每个值 与第一个表达式相关的计算和副作用在每个值计算之前排序 以及与第二个或第三个表达式相关的副作用。
【讨论】:
所以,x ? *x++ : 0
不会增加 x
iff x == 0
以上是关于三元运算符是不是以定义的方式短路的主要内容,如果未能解决你的问题,请参考以下文章