您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > C语言内涵教程练习2参考答案
练习二2.1答:语句shortj=50000;在语法上虽然没有问题,可以理解为把整数50000赋值给short型变量j,但实际上它是有问题,因为变量j的了取值范围为-32768至32767,它的值不可能为50000。程序的输出结果为:分析:以短整型有符号数的方式输出变量j的实际值时,结果为-15536,与所赋值50000相差甚远。2.2答:计算机中的数据都是编码后的数据,实际上全部为01串,因此,不同类型的数据相互赋值时至少在形态上没有任何障碍。可以用负数给不能取负值的无符号整型变量赋值。程序的输出结果为:分析:以无符号短整型的方式输出变量j的实际值时,结果为65535,可见它的存储状态为16个1,而-1在计算机中的存储状态为32个1,因此,赋值操作使得变量j与-1的2个字节保持了一致。2.30xac=10×16+12=1720253=2×82+7×8+3=171-027=-(2×8+7)=-23-0x20=-(2×16)=-32升序排列为-0x20-02716902530xac2.4(一)分析:scanf函数要求用户输入三个有符号十进制整数,因此,它不会把-023中的0看作是八进制的标志,它把-0x23中的x看作是非法字符从而提前结束匹配认为用户输入了-0。(二)分析:替换之后,scanf函数要求用户输入一个有符号十进制整数一个有符号八进制整数和一个有符号十六进制整数,因此,它把-023看作八进制整数,把-0x23看作合法的十六进制整数。可见,scanf函数根据格式字符匹配用户的输入数据。2.5程序如下:#includestdio.hvoidmain(){longj=2147483647;printf(%ld\n,j+1);j=-2147483648;printf(%ld\n,j-1);}输出结果为:规律为:对于有符号整型,最大值加1变最小值;最小值减1变最大值。一个有符号整型变量j,一直重复执行j=j+1;,变量的取值会什么情况?一直重复执行j=j–1;呢?2.6答:程序为#includestdio.hvoidmain(){longj;shortk;j=128;k=128;printf(%lx\n,j);printf(%hx\n,k);j=-2;k=-2;printf(%lx\n,j);printf(%hx\n,k);}输出结果为:分析:由输出可知,当变量j和k的值为128时,j的存储状态为0x00000080k的存储状态为0x0080因此,正数的存储状态从2个字节变为4个字节时多余的字节只需补0即可。当变量j和k的值为-2时,j的存储状态为0xfffffffek的存储状态为0xfffe因此,负数的存储状态从2个字节变为4个字节时多余的字节只需补1即可。语句printf(“%hx,%lx”,-2,-2);的输出结果可理解为整数-2用2个字节和4个字节存储时的十六进制形式的存储状态。也就是说可以通过类似语句的输出结果分析这道题。2.7答:程序为:#includestdio.hvoidmain(){printf(%hu,%hu,%hu\n,-1,-2,-3);}程序的输出结果为:分析:规律为65536-1,65536-2,65536-3。2.8答:以.8为例,可以用下面的程序进制测试,能编译通过没有语法错误的就是合法的。#includestdio.hvoidmain(){floatf=.8;printf(%e\n,f);}不合法的有:12e2.0有同学用程序#includestdio.hvoidmain(){floatf;scanf(%f,&f);printf(%e\n,f);}测试时输入12e2.0,程序运行正确,就认为12e2.0也为合法的浮点型字面量。出现这种情况与scanf函数有关,当它遇到非法字符时自动停止转换,这个例子中,scanf函数遇到小数点后就停止了转换,把12e2赋值给了变量f。输入12e2.3时程序的输出依然为1.200000e+003。规律:一般形式:要有小数点,但整数部分和小数部分可以省略。指数形式:整数部分可以是整数或一般形式的浮点数,指数部分必须为整数。2.9答:程序中错误为:用scanf函数给double型变量赋值时,相对应的格式字符必须加长度修饰符l。2.10输出为:6.236.23用〝%.8f〞后的输出结果为:6.229999786.23000000用〝%.18f〞后的输出结果为:6.2299997806549072006.230000000000000400语句printf((3.11)%.18f+(3.12)%.18f=%.18f\n〞,fa,fb,fa+fb);和printf((6.23)%.18f\n〞,6.23);的输出结果为:(3.11)3.109999895095825200+(3.12)3.119999885559082000=6.229999780654907200(6.23)6.230000000000000400分析:变量fa的实际值为3.109999895095825200,变量fb的实际值为3.119999885559082000,它们的和为6.229999780654907200,而浮点型字面量6.23的实际值为6.230000000000000400,计算机中两者并不相等。2.11答:3.0/2.0的值为1.5,double型。3.0%2.0有语法错误,因为取余操作符的操作数必须为整型。1/3*3的值为0,int型,表达式中1/3先求值,得0,因此,原表达式的值为0。测试程序如下:#includestdio.hvoidmain(){printf(3.0/2.0=%f\n,3.0/2.0);printf(1/3*3=%d\n,1/3*3);}程序运行结果:2.12答:精度可简单理解为十进制小数与计算机中其编码所对应的实际值的精确程度。单精度可以保证小数点后面的6至7位是指最少能精确到小数点后面的6至7位。误差可分为转换误差和存储误差。如果一个十进制小数能转换成有限的二进制小数,且编码长度不超过相关存储单元的长度,则此十进制小数就可以无误差地存储在计算机的相关存储单元中。浮点型数据在使用时需时刻考虑其精度,防止类似练习2.10中出现的认为3.11+3.12一定等于6.23的问题。2.13答:程序的执行结果为:分析:由第一行的输出可知在VC6.0中,int型变量i的存储单元有4个字节。由第二行的输出可知在VC6.0中,longdouble型的存储单元有8个字节。由第三行的输出可知在VC6.0中,int型字面量23占4个字节。2.14答:ASCII码规律为:1)码长1个字节,且最高位为0。2)前32个字符为控制字符。3)字符0至字符9的编码依次相连。4)小写字母a到小写字母z的编码依次相连,大写字母也是如此。5)小写字母的编码大于大写字母的。2.15答:\x48是4×16+8=72号字符查表可知为H;\145是1×64+4×8+5=101号字符查表可知为e;\x6c是6×16+12=108号字符查表可知为l;\154是1×64+5×8+4=108号字符查表可知为l;\157是1×64+5×8+7=111号字符查表可知为o;\x2c是2×16+12=44号字符查表可知为,;\103是1×64+3=67号字符查表可知为C;\41是4×8+1=33号字符查表可知为!;\n在VC6.0中是回车符。因此,程序的执行结果为:提示:\145中145应全部理解为八进制数,是一个字符,而不能理解为字符\14加字符5或字符\1加字符4加字符5。编译程序有个“贪婪规则”,即只要正确,应尽可能多得组合相连的字符。字符\14加字符5可写成\0145。2.16答:程序的输出结果为:分析:字符型变量ca的存储的实际为字符0的ASCII码整数48(查表可知,其为48号字符),格式字符为c的时候,printf函数会输出48号字符的字形码,即输出0;格式为d时,printf函数就会先得到整数48,再将其转换成字符串48,然后输出字符4和字符的8的字形码,即输出48。2.17答:控制字符的输出通常表现为执行与之相关的操作,而普通字符的输出则表现为输出相关的字形码。2.18答:程序的输出结果为:输出\t与按下Tab键的效果相同。按下Tab键时,光标会向右移动,但它不是移动1个字符或者是固定的几个字符,它会移动到下一个8×n+1列(n为自然数)。由第二行的输出可知,当输出内容超出8列时,超出的部分会继续输出,而\t总是将输入输出位置光标定位到下一个8×n+1列。\b退格,将输入输出光标移到前一列,故printf(%d\b%d\n,23,56);的输出为256(3被5“覆盖”了)。\r回车,将输入输出光标移到本行开头,故printf(%d\r%d\n,123,56);的输出为563(12被56“覆盖”了)。提示:光标移到某列后,它不会删除当前列的内容,只有再次输入或输出时新的内容才会“覆盖”掉当前列的内容。2.19答:只输入或输出一个字符时选用getchar函数或putchar函数比较简单。2.20答:语句scanf(%c%d,&ca,&j);执行时,与用户第一次按下的键相对应的字符将存储到变量ca中,如用户输入的是523↙,则变量ca的值为字符5,变量j的值为整数23。语句scanf(%d%c,&j,&ca);执行时,用户输入的第一个整数将存储到变量j中,与整数相邻第一个字符将存储到变量ca中,如用户输入的是235↙,则变量j的值为整数23,变量ca的值为空格字符。分析:格式字符d匹配时如果遇到的第一个字符是空格字符,则printf函数忽略掉该字符。格式字符c匹配时printf函数会将任何一个字符都看成用户有效的输入。详细的分析参见深度探究。2.21答:不能。如用户输入987时,则变量cb、cs、cg的值分别为字符9、字符8和字符7,倒序数加1为790,变量cb需由字符9变为字符0,而变量cs需由字符8变为字符9,如用户输入897时,只需将变量cb由字符8变为字符9即可,而变量cs的值无须改变,目前为止,没有办法根据用户输入的数据做针对性的改变。2.22答:char型一个字节,如果是有符号整型时,其取值范围为-128至127,如果是无符号整型时,其取值范围为0至255。测试程序如下:#includestdio.hvoidmain(){charca=-3;printf(%d\n,ca/2);}程序的运行结果:分析:如果在VC6.0中,char型是无符号整型,则ca的值肯定为正数,ca/2的商肯定为正数,现在程序的输出结果为-1,可见,ca的值为负数,即char为有符号整型。测试程序如下:#includestdio.hvoidmain(){unsignedcharca=-3;printf(%d\n,ca/2);}程序的运行结果:分析:由程序的输出可见,在VC6.0中,可以用unsignedchar定义无符号字符型。语句printf(%d,'a'-'A');的输出值是32,表示一个小写字母的ASCII码与其相对应的大写字母的的差。当变量ca的值为小写字母a,ca-32中ca表现为一个整数即小写字母a的ASCII码,去掉32后,正好是大写字母A的ASCII码,故语句printf(%c,ca-32)将输出大写字母A。语句printf(%c,ca-32);和语句printf(%c,ca-('a'-'A'));及语句printf(%c,ca-'a'+'A'));都可以输出大写字母A,但它们的可读性不一样。没有必要记住大小写字母相差多少,使用表达式'a'-'A'具有更好的可读性。ca-'a'表示ca中的小写字母与小字字母a相差多少个字母,再加'A'表示从大写字母A开始往下数相应个字母就可以得到要求的大写字母了。虽然语句charca=256;可以执行没有语法错误,但它是有问题的。256的二进制形式为100000000,赋值后变量ca的存储状态为八个0。用语句printf(
本文标题:C语言内涵教程练习2参考答案
链接地址:https://www.777doc.com/doc-2907870 .html