我有以下程序(koko.c):
#include <stdio.h>
int main(){
double p = 0.1;
printf("%lf, %d\n", 1/p, 1/p);
return 0;
}
如果我尝试使用 gcc koko.c -o koko
编译它,我收到错误:
koko.c:4:2:警告:格式'%d'需要类型为'int'的参数,但参数3的类型为'double'[-Wformat =] printf(“%lf,%d \ n”,1 / p,(int)1 / p);
如果我尝试禁用Wformat(即 gcc koko.c -Wformat=0 -o koko
),它会编译,但是当我运行它时,我得到意外的输出: 10.000000, -915298312
.
有没有想过为什么会这样?
2 回答
运算符优先级 .
Cast是一个比分区更高优先级的运算符,这意味着它首先发生 . 所以这:
相当于:
这导致
double
.你要这个:
并启用这些警告! 99.9999%的时间,编译器比你大!
施法者比该师有more precedence . 你正在做
((int)1)/p
.