Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C printf函数有问题吗?_C_Casting_Printf - Fatal编程技术网

C printf函数有问题吗?

C printf函数有问题吗?,c,casting,printf,C,Casting,Printf,我编写了以下程序 #include <stdio.h> main() { int i = 2; float c = 4.5; printf("%d\n",c); printf("%f\n",i); return 0; } 但是当我用这种方式交换printf语句时 #include <stdio.h> main() { int i = 2; float c = 4.5; printf("%f\n",i); printf("%d\n",c); retu

我编写了以下程序

 #include <stdio.h>

 main()
 {
 int i = 2;
 float c = 4.5;
 printf("%d\n",c);
 printf("%f\n",i);
 return 0;
 }
但是当我用这种方式交换printf语句时

#include <stdio.h>

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

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

整数和浮点有不同的内部表示形式,因此您不能将
printf
%f
%d
错误,以避免不可预知的结果。人们使用C尤其是因为C很快,而且它很快只是因为它让所有的一切都由程序员负责。所以不要期望printf在引擎盖下做一些神奇的转换,因为它不会。printf不会转换它的参数。它查看包含一个浮点数的内存,并将其打印为一个整数,就像拿一个MP3文件,让word打开它,就像它是一个文档一样


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

使用不正确的格式描述符会导致未定义的行为

未定义的行为意味着无法解释该行为。它可能会起作用,也可能不会产生不可预测的结果,这种行为可能会有所不同,不能以可移植的结论性方式对所有编译器进行解释

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

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

  • %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;
}
#包括
int main(){
int i=2;
浮点数c=4.5;
printf(“%d\n”,i);
printf(“%f\n”,c);
返回0;
}

您需要检查浮点在未定义行为下是如何表示的,是吗?你为什么这么感兴趣到底发生了什么?相反,你可以花时间学习如何编写好代码,不要使用任何导致未定义行为的东西,还有很多东西需要学习,因此,我的投票支持“不要在这上面浪费时间”@Armen Tsirunyan…没错…但编码也可以从异常行为中学习,确切地说,你将知道编译器的行为。如果你试图接受它提供的一切,那么这就是所谓的抢劫!这可以很好地解释。它在内存中查找,并尝试将在内存中找到的内容解释为您指定的格式。公平地说,可以通过查看编译器生成的机器代码来解释。只是人们无法从中推断出任何有用的结论。@George Kastrinis:除非你深入研究机器代码,否则你无法得出任何有用的结论。知道浮点的表示法是标准的“深入研究机器代码”?@Oli Charlesworth:它不是定义为未定义的行为吗?我们可以深入研究某个特定编译器的机器代码,并推断出关于该特定编译器行为的结论,我们能期望这些结果在所有编译器中都是一致的吗?我不这么认为。
0.000000
0
#include <stdio.h>

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