这个宏用于计算sqrt(x),
#define SQRT(x) ((x)<=0.0||(x)!=(x)?0.0:sqrt(x))
Run Code Online (Sandbox Code Playgroud)
我无法理解在哪种情况下第二个条件(x)!=(x)
可能是真的?
(x) != (x)如果x是IEEE 754非数字(NaN),则为真.即,此宏尝试将结果强制为0.0,以获取未定义平方根的参数值.该开方(3)Linux手册页总结了很好的返回值:
返回值
成功时,这些函数返回x的平方根.
如果
x是NaN,则返回NaN.如果
x是+0(-0),则返回+0(-0).如果
x是正无穷大,则返回正无穷大.如果
x小于-0,则发生域错误,并返回NaN.
因此,此表达式确保代替NaN,将为第一个和第四个案例返回0,此外,errno不会触及并且不会发生浮点异常.
(顺便说一句,如果你在宏参数中有副作用,这个奇怪的宏是不安全的,所以它最好用内联函数或类似的代替)