在C中没有警告的情况下将double常量赋给float变量?

OnT*_*Way 7 c floating-point

在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)

结果(包括双变量)显然会失去精度,但编译时没有任何警告.
那么编译器对此做了什么?还是我误解了什么?

R..*_*R.. 7

-Wall没有启用关于精度损失,值截断等的警告,因为这些警告是恼人的噪音并且"修复"它们需要用丑陋的演员阵容混乱正确的代码.如果您需要此类警告,则需要明确启用它们.

另外,你的使用printf与实际变量的精度无关,只是精度printf在打印时,默认为小数点后的6位.