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;
}