使用gcc将double转换为int会产生奇怪的结果

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.

有没有想过为什么会这样?

在此输入图像描述

Jon*_*art 5

运算符优先级.

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%的时间,编译器比你大!