在C编程语言中,浮点常量默认为double类型,
因此3.1415是double类型,除非使用'f'或'F'后缀来指示float类型.
我认为const float pi = 3.1415会引起警告,但事实并非如此.
当我用-Wall在gcc下尝试这些时:
float f = 3.1415926;
double d = 3.1415926;
printf("f: %f\n", f);
printf("d: %f\n", d);
f = 3.1415926f;
printf("f: %f\n", f);
int i = 3.1415926;
printf("i: %d\n", i);
Run Code Online (Sandbox Code Playgroud)
结果是:
f: 3.141593
d: 3.141593
f: 3.141593
i: 3
Run Code Online (Sandbox Code Playgroud)
结果(包括双变量)显然会失去精度,但编译时没有任何警告.
那么编译器对此做了什么?还是我误解了什么?
-Wall没有启用关于精度损失,值截断等的警告,因为这些警告是恼人的噪音并且"修复"它们需要用丑陋的演员阵容混乱正确的代码.如果您需要此类警告,则需要明确启用它们.
另外,你的使用printf与实际变量的精度无关,只是精度printf在打印时,默认为小数点后的6位.