已解决问题 - 浏览139次
下一个已解决问题来看看这个C语言程序
#include<stdio.h>
void main()
{
int i=1,j=2,k;
float a=1,b=2,c;
c=a/b;k=i/j;
printf("c=%f k=%f
",c,k);
printf("k=%f c=%f
",k,c);
}按理说C的值应为0.5,K为0。通过变量跟踪,确实如此,不过输出却出了问题,输出为:C=0.500000 K=0.000031(换行)K=0.000000 C=0.000031,我是在TC3.0环境下编译的。哪位高手来解释一下为什么这样。
最佳答案 - 由提问者2个月前选出
从此问题可以看出你不了解C语言传递函数参数的原理。
C语言传递函数参数是通过堆栈进行的,调用前将各参数的值压栈,进入函数后将各值弹栈。k是个整数,占2字节内存,调用printf函数前压栈里,只压入2个字节;按单精度输出的话,在printf函数内部弹栈时弹出去4个字节。这样实际上把原来单精度数据c的值的2个字节给弹出了,然后数据c弹栈时,从栈顶补2个字节数据,因为出来的数据是错误的,并且具体值是多少也不确定。
-
过客
121.35.109.*
其实我也不会,但是我也很想学,你还是让你教教我吧
-
过客
222.160.233.*
你把整型的数值以f%的形式输出,整型占2字节,float占4个字节。必然会因为输出是%f补上2个字节的位置,这2个位置在内存中是不确定的,所以关键的位数上的值是正确的,后补位数上的值是随机的
-
不过还是不明白。
提问者对最佳答案的评价
多谢!!
其他回答(2)
-
过客
59.39.253.*
%f应改为%1.1f
-
输出格式的问题
printf("c=%f k=%f ",c,k);//改为:printf("c=%f k=%d",c,k);
printf("k=%f c=%f ",k,c);//改为:printf("k=%d c=%f",k,c);

shisongeagle












