已解决问题 - 浏览139次

下一个已解决问题
shisongeagleshisongeagle

伴读书童


来看看这个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环境下编译的。哪位高手来解释一下为什么这样。

还可输入300个字

请输入上图中的验证码,字母不区分大小写。

点击查看更多 程序 看看 相关信息

武林高手武林高手

勤学秀才


最佳答案 - 由提问者2个月前选出

从此问题可以看出你不了解C语言传递函数参数的原理。
C语言传递函数参数是通过堆栈进行的,调用前将各参数的值压栈,进入函数后将各值弹栈。k是个整数,占2字节内存,调用printf函数前压栈里,只压入2个字节;按单精度输出的话,在printf函数内部弹栈时弹出去4个字节。这样实际上把原来单精度数据c的值的2个字节给弹出了,然后数据c弹栈时,从栈顶补2个字节数据,因为出来的数据是错误的,并且具体值是多少也不确定。

0 0
  • 过客

    过客

    121.35.109.*

    其实我也不会,但是我也很想学,你还是让你教教我吧

  • 过客

    过客

    222.160.233.*

    你把整型的数值以f%的形式输出,整型占2字节,float占4个字节。必然会因为输出是%f补上2个字节的位置,这2个位置在内存中是不确定的,所以关键的位数上的值是正确的,后补位数上的值是随机的

  • shisongeagleshisongeagle

    伴读书童


    不过还是不明白。

还可输入300个字

请输入上图中的验证码,字母不区分大小写。

提问者对最佳答案的评价 *

多谢!!

其他回答(2)

  • 过客

    过客

    59.39.253.*

    %f应改为%1.1f

    还可输入300个字

    请输入上图中的验证码,字母不区分大小写。

  • id_staticid_static

    饱学秀才


    输出格式的问题
    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);

    还可输入300个字

    请输入上图中的验证码,字母不区分大小写。

返回知识堂首页>>

如果您没能找到需要的内容,请
提出您的问题>>


猜你喜欢看

更多
1