我在 C 中看到了 MAX 宏的两种可能实现。其中哪一种最好?
define MAX(X,Y) ((X) < (Y) ? : (Y) : (X))
define MAX(X,Y) 0.5*(X+Y+ABS(X-Y))
我在 C 中看到了 MAX 宏的两种可能实现。其中哪一种最好?
define MAX(X,Y) ((X) < (Y) ? : (Y) : (X))
define MAX(X,Y) 0.5*(X+Y+ABS(X-Y))
第二个很难阅读,实际上已经坏了。真是个坏主意。
我还推荐函数,而不是宏,因此不会对参数进行两次评估。
在某些情况下,这种棘手的版本是合适的。例如在常数时间内计算两个整数的最大值。但它们很少见,当然不应该用作MAX
.
第一个版本更通用、更高效且更易于理解。
第二个版本使用浮点常量,这使得它特定于双精度数。它可能会返回错误的答案,因为浮点计算可能会四舍五入。(由于二进制值无法准确表示每个可能的十进制值,例如 0.1)还涉及更多计算。与 0.5 的乘法没有括在括号中,这可能会导致意外结果。
还有编译器优化的问题,但我不打算讨论。