我经常在表达式中使用错误的文字,例如将float除以int,如下所示:
float f = read_f();
float g = f / 2;
我相信编译器在这种情况下首先将int literal(2)转换为float,然后应用除法运算符。 GCC和Clang总是让这样的东西通过,但Visual C ++警告隐式转换。所以我必须这样写:
float f = read_f();
float g = f / 2.0f;
这让我想知道:我总是使用适当的文字用于浮点数,双数,长数等吗?每当我能逃脱时,我通常会使用int literals,但我不确定这是否真的是一个好主意。
答案 0 :(得分:2)
您应该始终明确指出您打算使用的文字类型。这可以防止出现问题,例如这种代码:
float foo = 9.0f;
float bar = foo / 2;
更改以下内容,截断结果:
int foo = 9;
float bar = foo / 2;
当你有重载和模板时,这也是函数参数的一个问题。
我知道gcc有-Wconversion
,但我不记得它涵盖的一切。
对于适合int
的整数值,我通常不会限定long
或unsigned
的值,因为通常会有更少的机会出现细微的错误。
答案 1 :(得分:1)
对于“应该”的问题,几乎从来没有一个绝对正确的答案。谁将使用此代码,为什么?这与此相关。但是,特别与浮动有关,最好养成准确指定所需操作的习惯。 float*float
以单精度完成。任何带有double的东西都是双精度的,2
会被转换为double,所以你在这里指定了不同的操作。
这里最好的答案是What Every Computer Scientist Should Know About Floating-Point Arithmetic。我会说,不要这样做,博士,浮点数没有简单的答案。