如何评价这个陈述?

Jes*_*ica 3 c++

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

#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.

Ree*_*sey 9

键入时:

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.也就是说,使用内联函数会更清晰,并避免这种情况.

  • 通过将其包装在parens中,您对宏的修复将不适用于所有情况.考虑`ABS(t> = 0?-1:1)`.这不会像人类预期的那样扩大.对于宏,通常将参数包装在parens中,并包装整个宏:`#define ABS(X)((X)> = 0?(X):( - 1)*(X))`(即使这不是'处理所有情况,尤其是X有副作用的情况.但它确实很好) (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的直观答案不正确.