0

我在 C 中看到了 MAX 宏的两种可能实现。其中哪一种最好?

  1. define MAX(X,Y) ((X) < (Y) ? : (Y) : (X))
  2. define MAX(X,Y) 0.5*(X+Y+ABS(X-Y))
4

2 回答 2

4

第二个很难阅读,实际上已经坏了。真是个坏主意。

  1. 第二个总是使用双打。你会得到四舍五入的错误。我当然不会期望得到不等于任何一方的结果。
  2. 当应用于整数时,它返回一个双精度值,这非常令人惊讶。花车也被提升为双倍。
  3. 如果您通过将 *0.5 替换为 /2 来“修复”它,它会在其他类型上“工作”,但您会在大整数上遇到意外溢出。

我还推荐函数,而不是宏,因此不会对参数进行两次评估。

在某些情况下,这种棘手的版本是合适的。例如在常数时间内计算两个整数的最大值。但它们很少见,当然不应该用作MAX.

于 2013-03-21T10:18:58.490 回答
2

第一个版本更通用、更高效且更易于理解。

第二个版本使用浮点常量,这使得它特定于双精度数。它可能会返回错误的答案,因为浮点计算可能会四舍五入。(由于二进制值无法准确表示每个可能的十进制值,例如 0.1)还涉及更多计算。与 0.5 的乘法没有括在括号中,这可能会导致意外结果。

还有编译器优化的问题,但我不打算讨论。

于 2013-03-21T10:09:06.097 回答