如何评价这个陈述?

时间:2013-08-26 23:24:39

标签: c++

如果我将数字的绝对值定义为

#define ABS(X) X >= 0 ? X : (-1) * X

会是什么

ABS(2) + ABS(-3)

评估到?我的朋友声称它评估为2。

3 个答案:

答案 0 :(得分:9)

键入时:

ABS(2) + ABS(-3)

这将替代:

2 >= 0 ? 2 : (-1) * 2 + -3 >= 0 ? -3 : (-1) * -3

你可以解决这个问题:

2 >= 0 ? 2 : -5 >= 0 ? -3 : (-1) * -3

或者:

2 >= 0 ? 2 : (-5 >= 0 ? -3 : (-1) * -3)

第一部分(2 >= 0)的计算结果为true,因此评估为2

请注意,您可以通过将宏编写为:

来轻松解决此问题
#define ABS(X) ((X) >= 0 ? (X) : (-1) * (X))

这将使评估顺序保持预期,并使其解析为5而不是2.也就是说,使用内联函数会更清晰,并避免这种情况。

答案 1 :(得分:5)

预处理器执行基于文本(实际上是基于令牌的)替换。它没有注意逻辑表达式分组。

鉴于

#define ABS(X) X >= 0 ? X : (-1) * X

ABS(2)

扩展为

2 >= 0 ? 2 : (-1) * 2

ABS(-3)

扩展为

-3 >= 0 ? -3 : (-1) * -3

所以

ABS(2) + ABS(-3)

扩展为

2 >= 0 ? 2 : (-1) * 2 + -3 >= 0 ? -3 : (-1) * -3

现在看看如何对操作符进行分组,您将看到为什么5的直观答案不正确。

答案 2 :(得分:3)

以下是我的阅读方式:

ABS(2) + ABS(-3)

变为:

2 >= 0 ? 2 : (-1) * 2 + -3 >= 0 ? -3 : (-1) * -3

添加一些内容以澄清:

(2 >= 0) ? 2 : (((-1) * 2 + -3 >= 0) ? -3 : (-1) * -3)

评估:
2实际上> = 0,因此: 2
(以及(((-1开头的所有其他内容都将被忽略)

所以,我同意你的朋友。