奇怪的铸造好奇心在C.

时间:2014-02-17 05:26:54

标签: c++ c

我是计算机编程的初学者,只用基础语言做了几年,现在我正在转向更复杂的语言,如C和C ++。

我在C中发现了一些东西,我无法绕过它。 而且我不会不理会这一点,因为那些突然出现并且仍未解决的事情从未得到解决。 这是我开始编写的代码:

#include <stdio.h>;
#include <math.h>;
#define pi 3.14
#define abs(v)(v<0?-v:v)
int main()
{
printf("%d",(int)ceil(abs(pi)));
}

现在,这是我的琢磨。 为什么会这样呢,

printf("%d",(int)ceil(abs( pi )));

应该返回4,

但当我将施法操作符放置时:

printf("%d",ceil((int)abs( pi )));

它返回0?

对我来说没有意义,因为它应该返回4,因为(int)abs(pi)返回3,但它仍然在之前被清除。所以从本质上说它应该说,好吧,我已经抓住了3作为abs(pi)的铸造类型,现在我已经把它弄清楚了,所以它应该返回4。

但是没有它返回0。

应该不是

(int) ceil(abs( pi )) 

相当于

ceil( (int) abs( pi ) ) ? ?

如果只是编程可以像说“做这件事”一样简单,那么突然间一切都完美无瑕。

1 个答案:

答案 0 :(得分:6)

尝试更改:

printf("%d",ceil((int)abs( pi )));

...为:

printf("%f",ceil((int)abs( pi )));

您当前的问题几乎肯定源于ceil返回double这一事实,但您告诉printf期待int

当然,对于C ++,请跳过所有这些并使用:

std::cout << ceil((int)abs( pi ));

或:

std:cout << ceil(static_cast<int>(abs(pi)));

...让编译器跟踪转换的正确类型。

对于它的价值,我希望这会产生3,而不是4。转换为int会将Pi截断为3。然后将转换为双倍。由于它没有小数部分,因此ceil将保留3