当我在代码中使用命名常量时,我一直在尝试减少隐式类型转换。例如,而不是使用
const double foo = 5;
我会用
const double foo = 5.0;
因此不需要进行类型转换。但是,在我做这样的事情的表达中......
const double halfFoo = foo / 2;
等。这是2被评估为整数并且是否被隐式转换?我应该使用2.0吗?
答案 0 :(得分:5)
2
被隐式转换为double,因为foo
是双精度型。你必须要小心,因为如果foo
是一个整数,则会执行整数除法,然后结果将存储在halfFoo
中。
我认为最好始终使用浮点文字(例如2.0
或2.
,无论您希望将它们用作浮点值。它更一致,可以帮助您找到可能出现这种事情的恶性错误。
答案 1 :(得分:2)
这称为Type Coercion。维基百科对它有一点了解:
隐式类型转换,也称为强制转换,是编译器的自动类型转换。有些语言允许甚至要求编译器提供强制。
在混合类型表达式中,可以在运行时根据需要将一个或多个子类型的数据转换为超类型,以便程序正确运行。
...
应谨慎使用此行为,因为可能会出现意外后果。当浮点表示转换为整数表示时,数据可能会丢失,因为浮点值的小数部分将被截断(向下舍入)。相反,从积分表示转换为浮点表示也会失去精度,因为浮点类型可能无法准确表示整数(例如,float可能是IEEE 754单精度类型,不能代表完全是整数16777217,而32位整数类型可以)。这可能导致诸如将相同的整数值存储到integer和type类型的两个变量中的情况,如果相等则返回false。
在C和C ++的情况下,整数类型(即long,整数,short,chars)的表达式的值是表达式中最大的整数类型。我不确定,但我想象类似的事情发生(假设浮点值比整数类型“更大”)表达式涉及浮点数。
答案 2 :(得分:2)
严格地说,你想要实现的目标似乎适得其反。
通常,人们会努力减少C程序中显式类型转换的数量,并且通常会减少源代码中的所有和任何类型的依赖关系。好的C代码应尽可能与类型无关。这通常意味着避免任何明确拼写特定类型的语法元素是一个好主意。最好做
const double foo = 5; /* better */
大于
const double foo = 5.0; /* worse */
因为后者是多余的。 C语言的隐式类型转换规则将确保前者正常工作。关于比较也可以这样说。此
if (foo > 0)
优于
if (foo > 0.0)
因为前者更像是与类型无关。
在这种情况下隐式类型转换是一件非常好的事情,而不是一件坏事。它可以帮助您编写与泛型无关的代码。你为什么试图避开它们?
确实,在某些情况下,您没有其他选择,只能明确表达类型(例如使用2.0
而不是2
等)。但通常只有当一个人必须这样做时才会这样做。为什么有人会在没有真正需要的情况下做到这一点超出我的范围。