使用三元运算符时是否对这两个表达式都进行了评估?

亨利·戴克曼

我在练习一些 Leetcode 问题时遇到了这个意外的运行时错误。我正在做一些有符号整数运算并尝试将我的输入设置为负数(即 5 => -5 和 -8 => -8)

但是,在使用三元运算符时输入 INT_MIN 的情况下,会出现整数溢出。使用 if 语句,我没有。

x = x < 0 ? x : x * -1;

>>> runtime error: negation of -2147483648 cannot be represented in type 'int'

对比

if (x > 0)
    x *= -1;

>>> no problems with this one

Leetcode 说“使用 gnu99 标准使用 gcc 8.2 编译”。语言信息。这是所有 C 版本的预期行为吗?我天真的期望是三元运算符只是正常控制流的语法糖,但显然我错了

克里斯·多德

不可以。规范要求只?评估 之后的操作数之一。从 C99 规范的 6.5.15 开始:

评估第一个操作数;在其评估之后有一个序列点。仅当第一个比较不等于 0 时才计算第二个操作数;仅当第一个比较等于 0 时才评估第三个操作数;结果是第二个或第三个操作数的值(以评估的为准),转换为下面描述的类型。如果尝试修改条件运算符的结果或在下一个序列点之后访问它,则行为未定义。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用具有4个表达式的三元运算符

条件表达式/三元运算符

使用三元运算符时出现“表达式必须具有整数类型”错误

在 lambda 表达式中使用三元条件运算符时,Linq select 返回错误结果

在使用过滤器的表达式中应用三元运算符

rvalue分配的三元表达式不使用移动分配运算符

使用三元运算符分配给表达式

使用三元运算符在计算器上非法开始表达式

在给出“预期输出”的三元/运算符表达式中使用中断

在给出“预期输出”的三元/运算符表达式中使用中断

在反应三元运算符中使用AND语句(两个条件)

三元运算符评估

从Java 7开始,Java中的三元运算符仅评估一个表达式-Java 1.6和更低版本中的表达式不同吗?

没有中间表达式的三元运算符

JavaScript三元运算符表达式中的Return语句

堆叠三元运算符在Angularjs表达式中不起作用

CMake生成器表达式中的三元运算符

带条件(三元)表达式的运算符“ sizeof”

空第二表达式的Javascript三元运算符

具有反应路线的三元运算符中的多个表达式

C中三元运算符中的条件表达式

pylint讨论带有赋值表达式的三元运算符

将表达式从三元转换为逻辑运算符

来自三元运算符的赋值将忽略剩余的表达式

这个三元运算符表达式的等价物是什么?

三元运算符速记,用于在true / false子句中使用表达式的主题,而不是重复

如果不满足三元运算符的条件,是否可以写入两个值

是否允许三元运算符在C ++中对两个操作数求值?

在地图函数中使用三元运算符可同时渲染两个结果