为什么输出给出 3 ,期望 -3。如何在c中处理这种预处理?
#include<stdio.h>
#include<math.h>
#define sq(x) ((x<0)?sqrt(-x):sqrt(x))
int main()
{
int x;
x=sq(-9);
printf("%d\n",x);
return 0;
}
因为你的 #define "sq" 在计算平方根之前检查它是否为负数并将其转换为正数
它在做 sqrt(-x) 这是 sqrt(-(-9)) (取负数是正数)
所以它在做 sqrt(9)
等等,等等,等等。
我们是否试图在这里打破数学的基本规则?
-9 的平方根是 3 i。
那是因为 (-3)^2 是 9。负数具有“虚数”平方根。sqrt(-1) 是i。不是-1。(-1)^2 为 1。
你有这个定义:
define sq(x) ((x<0)?sqrt(-x):sqrt(x))
既然你通过了 -9,x<0
那就是真的,所以它正在做sqrt(9)
,即 3。
然后打印 3。
我认为,代码完全按照它被告知的那样做。
sq(x)
首先测试x < 0
- 在你的情况下,这是真的,所以sq(x)
调用sqrt(-(-9))
- 这是 3。
一个尝试的解决方案是(x < 0) ? -sqrt(-x) : sqrt(x)
,它将返回否定的否定根x
(我对你意图的最佳解释)。
如果你期望-3
,那么你可能是说
#define sq(x) ((x<0)?-sqrt(-x):sqrt(x))
但是为什么你会期望负数的负平方根超出了我的范围。