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