这两个是等价的吗?
float f = 3.14;
int i;
i = f; // 3
和
float f = 3.14;
int i;
i = (int) f; // 3
答案 0 :(得分:8)
编译器处理这两种情况的方式没有区别。生成的机器代码将是相同的。但是,第一个是隐式转换,第二个是显式转换。根据编译器标志,在执行失去精度的隐式转换时可能会收到警告。
在旁注中,文字3.14
的类型为double
,这意味着语句float f = 3.14
中也可能存在精度损失。一个干净的方法是写float f = 3.14f
,指明这是
类型float
的值3.14。
答案 1 :(得分:6)
他们是一样的。
在32位x86系统上使用GCC 4.8.2进行测试。
gcc -Wall -Wextra -Wpedantic
在编译此代码时不会发出任何警告,但是-Wconversion
会发出警告。
答案 2 :(得分:4)
是的,这些是等价的,没有任何区别。
答案 3 :(得分:0)
编译器足够智能,可以同时处理两种情况。但我更喜欢第二种方法,因为它在大型程序中更容易阅读。此外,建议您在显式转换中指定要投射的类型。最后,您的第一种方法可能无法在C#中使用 参考:http://msdn.microsoft.com/en-us/library/ms173105.aspx
答案 4 :(得分:0)
第二种转换也称为 c-cast ,应避免使用,至少在c ++中,最好使用 static_cast
使用static_cast时,编译器将检查是否可以进行转换(即可以将一种类型转换为另一种类型),而使用旧样式时,即使它们不兼容,它也将始终进行转换