-3

为什么输出给出 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;
}
4

5 回答 5

4

因为你的 #define "sq" 在计算平方根之前检查它是否为负数并将其转换为正数

它在做 sqrt(-x) 这是 sqrt(-(-9)) (取负数是正数)

所以它在做 sqrt(9)

于 2012-01-27T18:34:45.583 回答
1

等等,等等,等等。

我们是否试图在这里打破数学的基本规则?

-9 的平方根是 3 i

那是因为 (-3)^2 是 9。负数具有“虚数”平方根。sqrt(-1) 是i。不是-1。(-1)^2 为 1。

于 2012-01-27T18:38:30.603 回答
1

你有这个定义:

define sq(x)  ((x<0)?sqrt(-x):sqrt(x))

既然你通过了 -9,x<0那就是真的,所以它正在做sqrt(9),即 3。

然后打印 3。

于 2012-01-27T18:35:24.567 回答
1

我认为,代码完全按照它被告知的那样做。

sq(x)首先测试x < 0- 在你的情况下,这是真的,所以sq(x)调用sqrt(-(-9))- 这是 3。

一个尝试的解决方案是(x < 0) ? -sqrt(-x) : sqrt(x),它将返回否定的否定根x(我对你意图的最佳解释)。

于 2012-01-27T18:35:25.037 回答
0

如果你期望-3,那么你可能是说

#define sq(x)  ((x<0)?-sqrt(-x):sqrt(x))

但是为什么你会期望负数的负平方根超出了我的范围。

于 2012-01-27T18:37:49.177 回答