回 帖 发 新 帖 刷新版面

主题:[讨论]一个二级C语言的题目

今天考2级,有个题目是这样
[code=c]
#include <stdio.h>
main ( )
{  char c1, c2;
   scanf("%d", &c1);
   c2 = c1 + 9;
   printf("%c%c",c1,c2);
}

输入 48<回车> 输出 ?
[/code]

我感觉这题目太不严谨了,应该有好多个答案都是可以的。

回复列表 (共11个回复)

沙发

为什么

板凳

答案只可能是09
因为输入48时 scanf("%d",c1);是以整型录入 
c1=48;而c2=48+9=57了;
输出时是以%c形式输出出就得对应ASCII码表  48对应是字符0,57对应是字符9
所以答案就是09

3 楼

个人感觉这段代码有个好大的bug。
不过lz可以解释下为什么有多个答案额、

4 楼

[quote]为什么[/quote]
我是这样认为的:
1.题目里面是scanf("%d",&c1);c1是char类型,%d接收的是int类型。因此必定会造成溢出。考虑到有大尾端和小尾端存储方式,因此输入48以后,c1有可能是0或者48.所以不一定能输出09.

2.有的平台对内存对齐有严格的要求,如果c1的地址不是刚好符合int数据的对齐方式,有可能造成不可预料的结果。

5 楼


不过我还是填的是 09.
不知道对了没,感觉二级考试里面的题目好多不严谨。

6 楼

懂这题的意思就行了

7 楼

二级嘛  你要他严谨是不可能的

8 楼

只有两个答案,一个是在Low-High系统,而另一个则是High-Low系统
并且程序如果是在32位子系统中,那很有可能崩溃。
如果是在LH系统,那么答案正如楼主所言。
如果是在HL系统中,则答案为一片空白。

下面解释一下为何在32系统中有可能会挂:
32位系统中,c1与c2的空间为两个字节,但%d是4个字节;
如果系统对于局部变量并未使用字节对齐,或对齐的字节数不是大于或等于4,那么~~~~
scanf之后,c1和c2存了一半,另一半就把栈给破坏了~~~~~

9 楼

[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 楼

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

我来回复

您尚未登录,请登录后再回复。点此登录或注册