我不认为大多数编译器都会关心,例如,如果不将f附加到浮点类型的变量上。但仅仅因为我希望尽可能明确和准确,我想表达正确的类型。文字操作数的类型
不同类型的两个文字操作数的结果类型是什么,还是取决于具体情况?例如为:
int i=1.0f/1;
float f=1.0f/1;
,编译器将不会在这两个实例抱怨,是不是因为文字类型,或者是由于操作的结果的类型根据上下文总是转换其宽容视图的?
我不认为大多数编译器都会关心,例如,如果不将f附加到浮点类型的变量上。但仅仅因为我希望尽可能明确和准确,我想表达正确的类型。文字操作数的类型
不同类型的两个文字操作数的结果类型是什么,还是取决于具体情况?例如为:
int i=1.0f/1;
float f=1.0f/1;
,编译器将不会在这两个实例抱怨,是不是因为文字类型,或者是由于操作的结果的类型根据上下文总是转换其宽容视图的?
第一个用int分隔一个浮点数,它总是导致一个浮点数(就像一个浮点数除以int)。这个浮点结果然后被转换成一个int来存储在i
中。
第二个采用操作导致的浮点数,并将其赋值给float变量,以保持浮点数。
这里有两个单独的问题:编译器如何解释具有或不具有后缀的文字,以及对混合数字类型执行的操作的结果。
首先,编译器确实在意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节。
类型文字的是在其它上下文中重要的,例如(假设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.
注意,一些编译器提供了宽松的模式,其中它们两者将产生相同的代码。