我不认为大多数编译器都会关心,例如,你不将f附加到float类型的变量。但仅仅因为我想尽可能明确和准确,我想表达正确的类型。
不同类型的两个文字操作数的结果类型是什么,还是取决于具体情况? e.g:
int i=1.0f/1;
float f=1.0f/1;
编译器不会在这两个实例中抱怨,是因为它对文字类型的容忍视图还是因为操作结果的类型总是根据上下文进行转换?
答案 0 :(得分:5)
首先,编译器确实关心f
后缀。 1.0
是双倍的。 1.0f
是一个浮点数。例如:
printf("%.15f %.15f\n", 0.1f, 0.1);
产生0.100000001490116 0.100000000000000
(请注意,第二个数字不是真正的0.1,而不是第一个,它离它更近)。
这不仅可以确定哪些数字可以表示也可以不表示,而且还可以确定此常量所涉及的操作类型。例如:
printf("%.15f %.15f\n", 1.0f/10.0f, 1.0/10.0);
产生与以前相同的输出。这里需要注意的重要一点是,1和10都可以完全表示为float
以及double
。我们所看到的并不是在字面上进行舍入,而是根据操作数的类型决定操作的类型。
编译器对您的示例并不宽容。他们严格执行您在the relevant standard中可以找到的规则,尤其是第6.3.1.4和6.3.1.5节。
答案 1 :(得分:1)
第一个将一个浮点除以一个int,它总是产生一个浮点数(就像将一个int除以一个浮点数一样)。然后将此float结果转换为int,以存储在i
。
第二个获取操作产生的浮点数,并将其赋值给float变量,保留浮点数。
这里有两个不同的问题:编译器如何解释带或不带后缀的文字,以及对混合数字类型执行的操作的结果。
答案 2 :(得分:0)
文字的类型在其他情境中很重要,例如(假设f
是float
):
f = f + 1.0; // Cast `f` to double, do a double-precision add, and case the result back.
f = f + 1.0f; // Single-precision addition.
请注意,某些编译器提供了一种宽松模式,它们都会生成相同的代码。