主题:[讨论]一个二级C语言的题目
windy0will
[专家分:2300] 发布于 2011-03-26 10:59:00
今天考2级,有个题目是这样
[code=c]
#include <stdio.h>
main ( )
{ char c1, c2;
scanf("%d", &c1);
c2 = c1 + 9;
printf("%c%c",c1,c2);
}
输入 48<回车> 输出 ?
[/code]
我感觉这题目太不严谨了,应该有好多个答案都是可以的。
回复列表 (共11个回复)
11 楼
windy0will [专家分:2300] 发布于 2011-03-31 18:47:00
[quote] Low-High系统与High-Low系统是否是内存中字地址按高位或地位地址编址?
对于32位系统中会挂的解释,我想问下,虽然scanf输入的是%d,但是应该是ASCII码的值吧,输入48后,c1中存储的是字符‘0’吧。。。照你这种解释的话,字符只能按%c输入啦?输入ASCII码就有可能会挂啊?求解释。。。[/quote]
其实 cgl_lgs 大牛已经解释得很清楚了。
c1对应的内存
int型得48在内存中得存放(16进制为0x00 00 00 30) ↓
大尾端:高字节存在低地址内存中 (高地址)30 00 00 00(低地址):30是最低位
小尾端:低字节存在低地址内存中 (高地址)00 00 00 30(低地址):30是最低
很显然在小尾端得情况下, c1才可能是0x30(既48)。
但在大尾端得情况下,c1却是0.这样c1=='\0', c2=='\9'这样c1,c2都是控制字符,是不会有输出结果可以看到的。
至于为什么有时候程序会挂掉,scanf函数执行以后,c1前面的内存已经被0x30 0x0 0x0(大端)或者0x0 0x0 0x0(小端)覆盖了,有些比较老的编译器没有内存对齐的时,被覆盖的内存极有可能存放的是主调函数的当前栈顶(ebp)或者是主调函数的下一条指令的地址(eip),这样程序不能正确的访问主调函数的变量或返回到正确的地址继续执行程序,因此可能会挂掉。
如果要接收一个8位的整数,好像这样是可以的:%hhd或%hhu。
我来回复