R B*_*R B 0 c gcc type-conversion
我有以下程序(koko.c):
#include <stdio.h>
int main(){
double p = 0.1;
printf("%lf, %d\n", 1/p, 1/p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用它来编译它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.
有没有想过为什么会这样?
运算符优先级.
Cast是一个比分区更高优先级的运算符,这意味着它首先发生.所以这:
(int) 1/p
Run Code Online (Sandbox Code Playgroud)
相当于:
((int) 1) / p
Run Code Online (Sandbox Code Playgroud)
这导致了double.
你要这个:
(int)(1/p)
Run Code Online (Sandbox Code Playgroud)
并启用这些警告!99.9999%的时间,编译器比你大!