主题:[讨论]一个二级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的话,可以先给一个整型,然后再用赋值语句给字符,虽然会截断,但总好过栈被破坏:)
我来回复