3

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

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

什么会

ABS(2) + ABS(-3)

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

4

3 回答 3

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) 评估为真,因此它评估为2

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

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

这将使评估顺序保持预期,并使其解析为 5 而不是 2。话虽如此,使用内联函数会更干净,并避免整个场景。

于 2013-08-26T23:31:03.617 回答
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 的直观答案是不正确的。

于 2013-08-26T23:30:12.453 回答
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被忽略)

所以,我同意你朋友的看法。

于 2013-08-26T23:31:41.187 回答