我是计算机编程的初学者,只用基础语言做了几年,现在我正在转向更复杂的语言,如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 ) ) ? ?
如果只是编程可以像说“做这件事”一样简单,那么突然间一切都完美无瑕。
答案 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
。