我有以下程序(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
。
有关为何会发生这种情况的任何想法?
答案 0 :(得分:5)
运营商优先权。
Cast是一个比division更高优先级的运算符,这意味着它首先发生。所以这个:
fetch
等同于:
(int) 1/p
会产生((int) 1) / p
。
你想要这个:
double
然后启用这些警告! 99.9999%的时间,编译器比你强!
答案 1 :(得分:3)
演员操作员more precedence比分区{}。你正在做((int)1)/p
。