代码之家  ›  专栏  ›  技术社区  ›  Aaron Yodaiken

自动铸造(或不?)在C中

  •  1
  • Aaron Yodaiken  · 技术社区  · 14 年前

    我试图从Ruby/PHP/Java背景中学习C,我发现你几乎总是明确地把事情(至少在教程中)。就像,我总是看到

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

    然而,在我的Mac版GCC上,自动铸造似乎是可行的。

    在某些事情上离开.0只是一种风格问题,还是某些C编译器不自动生成?

    3 回复  |  直到 14 年前
        1
  •  8
  •   caf    14 年前

    常量的类型为:

    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
    
        2
  •  3
  •   Clifford    14 年前

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

    显式强制转换将禁止此类警告,这是一种告诉编译器您是有意这样做的方法。如果您在没有考虑的情况下自由地应用强制转换,则可以防止编译器在数据或精度可能丢失时警告您。 有意的。

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

        3
  •  1
  •   mcandre    14 年前

    仅当添加精度(或至少不丢失任何精度)时,自动定位才有效,例如int-&g t;float、int-&g t;char、char-&g t;int。

    换一种方式进行则需要进行强制转换,因为如何降低精度取决于程序员。通常情况下,这是通过地板完成的,但具体应用可能需要随机地板和天花板。

    离开.0不是样式问题。这可能很重要;尝试显示3/5和3.0/5.0。它们是非常不同的。