第一部分 题目
分析下面的程序:
#include<stdio.h>
int main() {
char c1, c2;
c1 = 97;
c2 = 98;
printf("c1=%c,c2=%c\n", c1, c2);
printf("c1=%d,c2=%d\n", c1, c2);
return 0;
}
第二部分 问题及解答
1. 运行时会输出什么信息?为什么?
以下为使用visual studio 2022运行上述代码所得到的结果截图:

理由:首先,程序中定义了两个字符变量c1和c2,并分别给它们赋值为97和98。在ASCII码表中,97对应的字符是'a',98对应的字符是'b'。因此,当使用%c格式化输出时,会输出对应的字符,即 'a' 和 'b'。当使用%d格式化输出时,会输出字符的ASCII码值,即97和98。
2. 如果将程序第4,5行改为
c1=197;
c2=198;
运行时会输出什么信息?为什么?
以下为使用visual studio 2022运行上述代码所得到的结果截图:

出现上述运行结果的原因如下:
字符存储: 在C语言中,char类型通常是8位(1字节)的有符号整数,值的范围是-128到127。在这段代码中,赋值197和198给char类型的变量c1和c2。但是,这两个值超出了char类型的正值范围(127),因此发生了整数溢出,导致这些数值被解释为负数。
字符显示: 当用%c格式符输出时,字符编码会依据字符集(通常是ASCII或扩展的字符集,如UTF-8等)。197和198(或其对应的负值)在普通ASCII字符集中并没有对应的可显示字符,所以打印出来显示为 ?(即不可打印字符的占位符)。
数字显示: 当使用%d来输出时,输出的值是变量c1和c2的整数表示。在有符号的char类型中,197被解释为-59,198被解释为-58,所以第二个printf语句输出的结果是c1=-59,c2=-58。
3. 如果将程序第3行改为
int c1,c2;
运行时会输出什么信息?为什么?
如果将程序第3行改为int c1,c2;,那么c1和c2将不再是字符类型,而是整数类型。这意味着赋值时应该使用整数而不是字符。但是,如果仍然使用字符的ASCII码值来赋值(如97和98),那么在输出时,使用%c格式化输出会得到对应的字符,因为整数值会被隐式转换为对应的ASCII字符。使用%d格式化输出时,会输出它们的整数值。
以下为使用visual studio 2022运行上述代码所得到的结果截图:

1356

被折叠的 条评论
为什么被折叠?



