在c中自动铸造(或不是?)

时间:2010-06-21 19:27:51

标签: c casting

我正在尝试从Ruby / PHP / Java背景中学习C,并且我发现你几乎总是明确地投射东西(至少在教程中)。就像,我总是看到像

这样的东西
double x, y;
x = 1.0; 
/*...*/
y = x*5.0;

然而,似乎在我的Mac版本的GCC中,自动投射工作。

将.0留在事物上只是风格问题,还是做一些C编译器而不是自动播放?

3 个答案:

答案 0 :(得分:8)

常量具有分配给它的类型:

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

VS

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

答案 1 :(得分:3)

当隐式强制转换是不安全的(可能导致丢失位或精度)时,编译器应警告您,除非您设置的警告级别太低。很明显,在VC ++中,这意味着当默认值为3时警告级别为4.

显式强制转换会抑制此类警告,这是一种告诉编译器您是故意这样做的方法。如果您在不考虑的情况下自由地应用强制转换,则会阻止编译器在潜在的数据或精度损失 故意时向您发出警告。

如果必须进行强制转换,则应考虑您的数据是否具有适当的类型。有时你别无选择,或者它是一种适应第三方代码的便捷方式。在这种情况下,解释性评论可能是为了表明你真的考虑过它而不仅仅是习惯性地应用演员。

答案 2 :(得分:1)

自动展示仅在您添加精度(或至少不丢失任何精度)时有效,例如int - > float,int - > char,char - >中间体

另一种方式需要进行转换,因为程序员需要决定如何丢失精度。通常这是通过地板完成的,但具体应用可能需要随机地板和天花板。

离开.0不是风格问题。这很重要;尝试显示3/5和3.0 / 5.0。他们是非常不同的。