主题:[讨论]一个二级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个回复)
		
								
				沙发
				
					
Screenager [专家分:840]  发布于 2011-03-26 11:38:00				
				为什么
							 
						
				板凳
				
					
871696091 [专家分:30]  发布于 2011-03-26 11:38:00				
				答案只可能是09
因为输入48时 scanf("%d",c1);是以整型录入 
c1=48;而c2=48+9=57了;
输出时是以%c形式输出出就得对应ASCII码表  48对应是字符0,57对应是字符9
所以答案就是09
							 
						
				3 楼
				
					
fragileeye [专家分:1990]  发布于 2011-03-26 11:48:00				
				个人感觉这段代码有个好大的bug。
不过lz可以解释下为什么有多个答案额、
							 
						
				4 楼
				
					
windy0will [专家分:2300]  发布于 2011-03-26 11:53:00				
				[quote]为什么[/quote]
我是这样认为的:
1.题目里面是scanf("%d",&c1);c1是char类型,%d接收的是int类型。因此必定会造成溢出。考虑到有大尾端和小尾端存储方式,因此输入48以后,c1有可能是0或者48.所以不一定能输出09.
2.有的平台对内存对齐有严格的要求,如果c1的地址不是刚好符合int数据的对齐方式,有可能造成不可预料的结果。
							 
						
				5 楼
				
					
windy0will [专家分:2300]  发布于 2011-03-26 11:55:00				
				
不过我还是填的是 09.
不知道对了没,感觉二级考试里面的题目好多不严谨。
							 
						
				6 楼
				
					
hnuhsg1226 [专家分:150]  发布于 2011-03-26 16:40:00				
				懂这题的意思就行了
							 
						
				7 楼
				
					
hereforc [专家分:210]  发布于 2011-03-27 17:58:00				
				二级嘛  你要他严谨是不可能的
							 
						
				8 楼
				
					
cgl_lgs [专家分:21040]  发布于 2011-03-29 17:31:00				
				只有两个答案,一个是在Low-High系统,而另一个则是High-Low系统
并且程序如果是在32位子系统中,那很有可能崩溃。
如果是在LH系统,那么答案正如楼主所言。
如果是在HL系统中,则答案为一片空白。
下面解释一下为何在32系统中有可能会挂:
32位系统中,c1与c2的空间为两个字节,但%d是4个字节;
如果系统对于局部变量并未使用字节对齐,或对齐的字节数不是大于或等于4,那么~~~~
scanf之后,c1和c2存了一半,另一半就把栈给破坏了~~~~~
							 
						
				9 楼
				
					
likouketsu [专家分:30]  发布于 2011-03-29 22:40:00				
				[quote]只有两个答案,一个是在Low-High系统,而另一个则是High-Low系统
并且程序如果是在32位子系统中,那很有可能崩溃。
如果是在LH系统,那么答案正如楼主所言。
如果是在HL系统中,则答案为一片空白。
下面解释一下为何在32系统中有可能会挂:
32位系统中,c1与c2的空间为两个字节,但%d是4个字节;
如果系统对于局部变量并未使用字节对齐,或对齐的字节数不是大于或等于4,那么~~~~
scanf之后,c1和c2存了一半,另一半就把栈给破坏了~~~~~[/quote]
Low-High系统与High-Low系统是否是内存中字地址按高位或地位地址编址?
对于32位系统中会挂的解释,我想问下,虽然scanf输入的是%d,但是应该是ASCII码的值吧,输入48后,c1中存储的是字符‘0’吧。。。照你这种解释的话,字符只能按%c输入啦?输入ASCII码就有可能会挂啊?求解释。。。
							 
						
				10 楼
				
					
cgl_lgs [专家分:21040]  发布于 2011-03-31 14:08:00				
				[quote][quote]只有两个答案,一个是在Low-High系统,而另一个则是High-Low系统
并且程序如果是在32位子系统中,那很有可能崩溃。
如果是在LH系统,那么答案正如楼主所言。
如果是在HL系统中,则答案为一片空白。
下面解释一下为何在32系统中有可能会挂:
32位系统中,c1与c2的空间为两个字节,但%d是4个字节;
如果系统对于局部变量并未使用字节对齐,或对齐的字节数不是大于或等于4,那么~~~~
scanf之后,c1和c2存了一半,另一半就把栈给破坏了~~~~~[/quote]
Low-High系统与High-Low系统是否是内存中字地址按高位或地位地址编址?
对于32位系统中会挂的解释,我想问下,虽然scanf输入的是%d,但是应该是ASCII码的值吧,输入48后,c1中存储的是字符‘0’吧。。。照你这种解释的话,字符只能按%c输入啦?输入ASCII码就有可能会挂啊?求解释。。。[/quote]
输入ASCII的话,可以先给一个整型,然后再用赋值语句给字符,虽然会截断,但总好过栈被破坏:)
							 
									
			
我来回复