首页 文章

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

提问于
浏览
0

我有以下程序(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 .

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

enter image description here

2 回答

  • 5

    运算符优先级 .

    Cast是一个比分区更高优先级的运算符,这意味着它首先发生 . 所以这:

    (int) 1/p
    

    相当于:

    ((int) 1) / p
    

    这导致 double .

    你要这个:

    (int)(1/p)
    

    并启用这些警告! 99.9999%的时间,编译器比你大!

  • 3

    施法者比该师有more precedence . 你正在做 ((int)1)/p .

相关问题