求解!C语言!

[复制链接]
查看11 | 回复5 | 2011-9-19 01:17:09 | 显示全部楼层 |阅读模式
#include\"stdio.h\"voidsub(doublex,double*y,double*z){*y=*y-1.0;*z=*zx;}main(){doublea=2.5,b=9.0,*pa,*pb;pa=pb=sub(b-a,pa,pb);printf(\"%f\\n\",a);}
回复

使用道具 举报

千问 | 2011-9-19 01:17:09 | 显示全部楼层
输出分别为:1.500000-5,-12,-78追问能否写出解答步骤,不懂怎么算的
回复

使用道具 举报

千问 | 2011-9-19 01:17:09 | 显示全部楼层
第一题:sub(b-a,pa,pb);sub函数的功能{*y=*y-1.0;*z=*zx;}b-a=6.5pa=2.5pb=9.0sub(6.5,2.5,9.0)y=2.5-1.0y等于1.5z等于16.5但主函数main只输出a的值double型所以是1.500000第二题:sub(10,5,sub(7,a,sub(a,b,先要了解sub函数的功能sub就是把y-x的值赋给z就像第一个5-10赋给a所以a输出-5那2个也一样第三题:*(p=这句话就是先看右边*pk*(*pm)*pk等于2*pm等于4两个相乘就等于8再赋值给左边左边是(*p=defds123n)把n的地址赋给p就相当与赋给n所以n等于8
回复

使用道具 举报

千问 | 2011-9-19 01:17:09 | 显示全部楼层
1.1.516.52.-5-12-73.8追问能否写出解答步骤,不懂怎么算的
回复

使用道具 举报

千问 | 2011-9-19 01:17:09 | 显示全部楼层
我说说自己的理解,有不对的大家指正:第一个问题float和double类型的数值在内存中是以科学计数法的形式存在的,987654666777888.999化成科学计数法是9.87654666777888999e14,前7位有效数字为9876546,正好是结果987654640369664.000000中的前7位;至于后面的那些数字是怎么来的涉及到float和double在内存中的存在形式,讲起来太麻烦,你百度下,关键字“float存储”;第二个问题常用的几个编译器(tc,vc里的编译器,gcc)里,char是signedchar,其他编译器未知。再说下c的符号扩展问题:如果数据是有符号的,则将扩展的高位段全赋值为原来那个数的最高位,比如0xD0扩展后变为0xFFFFFFD0,0x20扩展后变为0x00000070;如果是无符号数的扩展,则高位直接填0,如0xD0扩展后变为0x000000D0(-_-b)。好了,开始你的问题:a是一个int值,在你的编译器下是占2个字节,(1234)10=(010011010010)2,执行到(char)a时前面的0100被忽略,截断后的值变成11010010,我们设charz=11010010,方便讲解。因为程序中定义了x是int型,而z是char型,因此编译器会再将z转换成int型,按照符号扩展原则,有符号的11010010扩展后变成1111111111010010,这个值换成十进制是-46,十六进制是0xFFD2。你可以试试x=(unsignedchar)a;
回复

使用道具 举报

千问 | 2011-9-19 01:17:09 | 显示全部楼层
学会debug,这个就自然懂了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行