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

时间:2016-11-02 17:31:38

标签: 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;
}

如果我尝试使用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 个答案:

答案 0 :(得分:5)

运营商优先权。

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

fetch

等同于:

(int) 1/p

会产生((int) 1) / p

你想要这个:

double

然后启用这些警告! 99.9999%的时间,编译器比你强!

答案 1 :(得分:3)

演员操作员more precedence比分区{}。你正在做((int)1)/p