我在mac os x上用c语言编程。我在math.h中使用sqrt,函数如下:
int start = Data -> start_number;
double localSum;
for (start; start <= end; start++) {
localSum += sqrt(start);
}
这有效,但为什么呢?为什么我没有得到警告?在sqrt的手册页中,它需要一个double作为参数,但我给它一个int - 它是如何工作的?
由于
答案 0 :(得分:11)
不会导致精度损失的类型转换可能不会引发警告。它们是隐含的。
int --> double //no loss in precision (e.g 3 became 3.00)
double --> int //loss in precision (e.g. 3.01222 became 3)
什么触发警告,什么不是取决于编译器和提供给它的标志,但是,大多数编译器(至少我使用过的)不要考虑隐式类型转换dangerous
足以保证警告,因为它是语言规范中的一项功能。
C99理由表明它像指南
探索这个(隐式转换)问题的一个重要结果是理解高质量的编译器可能看起来很好看 对于这种有问题的代码和提供(可选)诊断,以及 尽职尽责的教练可能会很好地警告程序员 隐式转换的问题。
答案 1 :(得分:3)
编译器知道sqrt
的原型,因此它可以 - 并且将 - 在调用函数之前生成将int
参数转换为double
的代码。
同样的方法也是如此,如果你将一个double
传递给一个带有int
参数的函数(使用已知原型),编译器将生成所需的转换代码。
编译器是否警告此类转换取决于编译器和您在命令行上请求的警告级别。
对于转换int -> double
,通常(使用IEEE754格式的32位(或16位)int
和64位doubles
)无损,收到警告如果可能的话,转换可能很难。
对于double -> int
转换,使用gcc和clang,您需要使用-Wconversion
专门请求此类警告,否则他们将以静默方式编译代码。
答案 2 :(得分:1)
Int可以安全地自动向上转换为double,因为没有数据丢失的风险。反之则不然。要将double变为int,您必须显式地转换它。
答案 3 :(得分:0)
C编译器使用double和int进行一些自动转换。 你也可以做以下事情:
int start = Data -> start_number;
int localSum;
for (start; start <= end; start++) {
localSum += sqrt(start);
}
即使localSum是一个int,它仍然可以工作,但它总会削减超出该点的任何东西 例如,如果sqrt()的返回值为1.365,则将其存储为简单的1。