奇怪的是,C

Odd casting curiosity in C

本文关键字:      更新时间:2023-10-16

我是计算机编程的初学者,只用基本语言做了几年,现在我正在学习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)的投射int,现在我已经收到了它,所以它应该返回4。

但没有,它返回0。

不应该

(int) ceil(abs( pi )) 

相当于

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

如果编程可以像说"做这件事"一样简单,然后突然间一切都完美地工作了就好了。

尝试更改:

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

相关文章:
  • 没有找到相关文章