【问题标题】:problem with printf function?printf 函数有问题吗?
【发布时间】:2011-08-29 16:00:48
【问题描述】:

我写了以下程序

 #include <stdio.h>

 main()
 {
 int i = 2;
 float c = 4.5;
 printf("%d\n",c);
 printf("%f\n",i);
 return 0;
 }

虽然我知道这是错误的做法,但当我运行程序时,我得到了答案

0
4.500000

但是当我以这种方式交换 printf 语句时

#include <stdio.h>

main()
{
int i = 2;
float c = 4.5;
printf("%f\n",i);
printf("%d\n",c);
return 0;
}

输出是

0.000000
0

我不明白发生了什么,请任何人解释一下。

【问题讨论】:

  • 你需要检查浮点是如何表示的en.wikipedia.org/wiki/Floating_point
  • 玩未定义的行为,是吗?为什么你对到底发生了什么如此感兴趣?取而代之的是,您可以花时间学习很好编码,不要使用任何导致未定义行为的东西,并且有一个很多 在那里学习,所以,我投票赞成“不要在这上面浪费你的时间”
  • @Armen Tsirunyan ......你是对的......但是编码也可以从异常行为中学习,确切地说你会知道编译器的行为。如果你试图接受它给出的一切,那就叫抢劫!

标签: c casting printf


【解决方案1】:

printf 不会转换它的参数。它正在查看包含浮点数的内存并将其打印为整数 - 这就像获取一个 MP3 文件并要求 word 打开它,就好像它是一个文档一样。

浮点数在内存中的存储方式与整数完全不同——它不仅仅是带有一些小数点的整数

【讨论】:

    【解决方案2】:

    使用不正确的格式描述符会导致未定义行为
    未定义的行为意味着无法解释行为。它可能会起作用,也可能不会产生不可预测的结果,无论如何,这种行为可能会有所不同,对于所有编译器,它不能以可移植的结论性方式进行解释。

    【讨论】:

    • 可以很好的解释。它在内存中查找并尝试将在那里找到的内容解释为您指定的格式。
    • 公平地说,可以通过查看编译器生成的机器代码来解释。只是无法从中推断并得出任何有用的结论。
    • @George Kastrinis:除非您深入研究机器代码,否则您无法做到。
    • 是否知道浮点的表示,这是一种标准的“深入挖掘机器代码”?
    • @Oli Charlesworth:它不是定义为未定义行为吗?可以深入研究特定编译器的机器代码并推断出关于该特定编译器行为的结论,我们能否期望这些结果在所有编译器中都是一致的?我不这么认为。
    【解决方案3】:

    基本上,格式占位符是关于如何从可变长度参数列表中检索和解释下一块内存的函数指令。它希望格式与您所说的完全相同。当您以意外的方式检索内存时,可能会导致各种问题和未定义的行为。这就是 printf 及其同类可被利用的原因。

    【讨论】:

      【解决方案4】:

      整数和浮点数具有不同的内部表示,因此您不能将printf %f%d 混淆以避免不可预测的结果。人们使用 C 特别是因为 C 速度快,而它之所以快只是因为它把所有事情都交给了程序员。所以不要指望 printf 做一些神奇的转换,因为它不会。

      【讨论】:

        【解决方案5】:

        基本上,格式控件会根据指定的数据类型替换占位符。

        • %d 需要 int 类型的参数
        • %f 需要 double 类型的参数

        这样做的好方法是

        #include <stdio.h>
        
        int main(){
           int i = 2;
           float c = 4.5;
           printf("%d\n",i);
           printf("%f\n",c);
           return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 2019-08-15
          • 1970-01-01
          • 2021-11-07
          • 2014-03-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-16
          相关资源
          最近更新 更多