我在练习一些 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] 删除。
我来说两句