如果我将数字的绝对值定义为
#define ABS(X) X >= 0 ? X : (-1) * X
Run Code Online (Sandbox Code Playgroud)
什么会
ABS(2) + ABS(-3)
Run Code Online (Sandbox Code Playgroud)
评价到?我的朋友声称它评估为2.
键入时:
ABS(2) + ABS(-3)
Run Code Online (Sandbox Code Playgroud)
这将替代:
2 >= 0 ? 2 : (-1) * 2 + -3 >= 0 ? -3 : (-1) * -3
Run Code Online (Sandbox Code Playgroud)
你可以打破这个:
2 >= 0 ? 2 : -5 >= 0 ? -3 : (-1) * -3
Run Code Online (Sandbox Code Playgroud)
要么:
2 >= 0 ? 2 : (-5 >= 0 ? -3 : (-1) * -3)
Run Code Online (Sandbox Code Playgroud)
第一部分(2 >= 0)的计算结果为true,因此它的计算结果为2.
请注意,您可以通过将宏写为:
#define ABS(X) ((X) >= 0 ? (X) : (-1) * (X))
Run Code Online (Sandbox Code Playgroud)
这将使评估顺序保持预期,并使其解析为5而不是2.也就是说,使用内联函数会更清晰,并避免这种情况.
小智 5
预处理器执行基于文本(实际上是基于令牌的)替换.它没有注意逻辑表达式分组.
特定
#define ABS(X) X >= 0 ? X : (-1) * X
ABS(2)
Run Code Online (Sandbox Code Playgroud)
扩展到
2 >= 0 ? 2 : (-1) * 2
Run Code Online (Sandbox Code Playgroud)
和
ABS(-3)
Run Code Online (Sandbox Code Playgroud)
扩展到
-3 >= 0 ? -3 : (-1) * -3
Run Code Online (Sandbox Code Playgroud)
所以
ABS(2) + ABS(-3)
Run Code Online (Sandbox Code Playgroud)
扩展到
2 >= 0 ? 2 : (-1) * 2 + -3 >= 0 ? -3 : (-1) * -3
Run Code Online (Sandbox Code Playgroud)
现在看看如何对运算符进行分组,您将看到为什么5的直观答案不正确.
| 归档时间: |
|
| 查看次数: |
210 次 |
| 最近记录: |