0

代码片段的o/p:

printf("%f", 9/5);
  1. 在我的 linux gcc 4.6.3 中(gcc myprog.c 后跟 ./a.out):

    -0.000000

  2. 在 codepad.org 中:

    2.168831

为什么有区别?

我已经提到了链接:为什么在 printf 中需要强制转换?C 中的隐式转换?,但无法使用它。

有关键盘执行的信息:C:gcc 4.1.2 标志:-O -fmessage-length=0 -fno-merge-constants -fstrict-aliasing -fstack-protector-all

编辑:更多:用于在(在同一程序中)键盘中执行以下操作

printf("%f\n", 99/5);
printf("%f\n", 18/5);
printf("%f\n", 2/3);
printf("%f\n%f\n%f", 2, 3, 4);
printf("%f\n", 2);

o/p 是

2.168831
2.168831
2.168831
0.000000
0.000000
-0.001246
-0.0018760.000000

前三个输出是相同的垃圾值(而不是最后一个)。想知道为什么。

4

3 回答 3

4

9/5 被视为int.. 当您使用格式说明符时会导致未定义的输出%f(它需要一个 double )

要打印正确的结果,请执行以下操作:

printf("%f", 9.0/5); // forces system to make sure that the argument is not treates as int

或者

printf("%f\n",(double)9/5); // type casting the argument to a double .. this is more helpful 
                            // in case you have a variable

我不确定 codepad.org 如何编译他们的代码.. 但是对于 gcc 你必须有正确的参数才能 printf 与格式说明符匹配


请考虑以下内容以更仔细地了解这一点:

#include <stdio.h>
int main(){ 
    printf("%f %d %f\n",9/5,9/5,9.0/5);
    printf("%f\n",1); // as suggested by devnull-again since the argument is not a double
                      // the output is undefined
    return 0;
}

输出:

$ ./test
0.000000 1 1.800000
0.000000
于 2013-11-10T11:23:55.310 回答
1

这是未定义的行为,任何东西都可以打印。9/5的类型是int. %f 需要传递a double(如果传递 a ,由于参数自动提升到可变参数函数调用,float它将被转换为,所以也可以)。double

既然你没有给双倍,任何事情都可能发生。

在实践中,假设sizeof(int)==4sizeof(double)==8,您的 printf 调用将读取 4 个字节的随机垃圾。如果这都是零,那么您将打印零。如果不是,您将打印随机的东西。

于 2013-11-10T11:24:07.507 回答
0

键盘错了。如果另有说明,每个数字都是 int - 这是解决方案的关键。

在 C/C++ 中,9/5 是 int 数,等于 1 这就是为什么你的:

printf("%f\n", 9 / 5);

是相同的:

printf("%f\n", 1);

但是为什么它打印 0.0 你问 - 这就是为什么。当 printf 被赋予 '%f' 标志时,它会将参数视为浮点数。

现在您的代码反汇编看起来/可能看起来像这样:

printf("%f\n", 9 / 5);
push        1    
call        dword ptr [__imp__printf (0B3740Ch)]

将 1 次移动(通常是 32 位 0x1)压入堆栈

现在最重要的是 32 位 value=1 的外观(二进制):

(MSB) 00000000 00000000 00000000 00000001 (LSB)

如果将其视为 32 位浮点(根据this),则此模式意味着什么:

符号(第 31 位)= 0

指数(接下来的 8 位,即 #30..#23)all = 0 too

分数(其余位)包含 1(十进制)

在此处输入图像描述

在理论上是但 exponent=0x0 是特殊情况(读取链接)并被视为 0.0 - 句点。

于 2013-11-10T11:25:48.123 回答