在C语言中是否自动进行类型转换?

3

我来自Ruby/PHP/Java背景,现在想学习C语言,发现在教程中几乎总是需要显式地进行类型转换。比如,我经常看到这样的代码:

double x, y;
x = 1.0; 
/*...*/
y = x*5.0;

然而,在我的Mac版本的GCC上,自动转换似乎是有效的。

在事物上保留.0只是一种风格问题,还是有些C编译器不会自动转换?


1
我在你的例子中没有看到任何显式转换。通常术语是隐式转换而不是自动转换。实际上,这个例子也没有隐式转换。 - Clifford
3个回答

10

常量的类型与它被赋值的类型相同:

int i = 1;
double x = 2; // 2.0

显式转换:

i = (int)x;
x = (double)i;

隐式转换:

i = x;
x = i;

类型提升:

x = i / 2.0; // i is promoted to double before being multiplied
x = (double)i / 2.0; // so evaluates as this

对比

x = i / 2; // i is not promoted because 2 is an int
x = (double)( i / 2 ); // so evaluates as this

常量没有被赋值的类型,它在赋值之前就有了自己的类型。赋值可以通过隐式转换来提升值,但这并不影响常量的类型。(实际上,在您的示例中,“字面量”比“常量”更合适)。 - A. Levy

3
当隐式转换不安全(可能会导致位或精度的丢失)时,编译器应该警告您,除非您设置了过低的警告级别。令人惊讶的是,在VC++中,这意味着在默认为3时警告级别为4。
显式转换将抑制此类警告,这是一种告诉编译器您是有意这样做的方法。如果您过于频繁地应用转换而没有考虑到数据或精度的潜在损失不是有意的,那么就会阻止编译器警告您。
如果您必须进行转换,则应考虑您的数据是否具有适当的类型。有时您别无选择,或者这是适应第三方代码的便捷方式。在这种情况下,可能需要添加解释性注释,以明确您真正考虑过这个问题,而不仅仅是习惯性地应用转换。

1

当你增加精度(或至少不会失去任何精度)时,自动转换才起作用,例如int->float,int->char,char->int。

反过来需要进行强制类型转换,因为由程序员决定如何失去精度。通常情况下,这是通过向下取整来完成的,但特定应用可能需要随机向下取整和向上取整。

.0不仅仅是一种风格问题,它可能非常重要;尝试显示3/5和3.0/5.0。它们是非常不同的。


1
吹毛求疵:从 int 转换为 float 可能会丢失精度。但通常认为这是可以接受的。 - Roland Illig
1
强制类型转换在进行有损转换时不是必需的,虽然编译器可能会生成警告。 - Clifford
@Roland Illig:float类型可以存储7个有效数字,因此任何大于9999999的整数可能无法被精确存储;正如您所说,这可能是可以接受的,但您需要理解它才能做出判断。 - Clifford
1
@Clifford:ISO C99在5.2.4.2.2p8中说:“FLT_DIG >= 6”,因此即使是7位整数,也可能太大而无法存储在float中。 - Roland Illig
1
@mcandre:一个七位数并不是那么大。我刚刚进行了一项测试,16777216是最高的正整数,所有比它小的值都可以精确地存储为浮点数。因此,所有七位数和一些八位数也可以;所以我的早期说法证明是准确的。 - Clifford
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接