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