【时时三省】(C语言基础)习题:分析一个程序
( 1 )运行时会输出什么信息?为什么?
( 2 )如果将程序第4,5行改为
c1 = 197;
c2 = 198;
运行时会输出什么信息?为什么?
( 3 )如果将程序第3行改为
int cl , c2 ;
运行时会输出什么信息?为什么?
( 1 )输出结果:
原因:
在C语言中, char 类型本质上是整数类型,它可以存储整数值。这里将整数97赋值给 c1 ,98赋值给 c2 。在ASCII码表中,97代表字符 'a' ,98代表字符 'b' 。
第一个 printf 函数使用 %c 格式说明符,它会将 c1 和 c2 的值当作字符来输出,所以输出 c1=a,c2=b 。
第二个 printf 函数使用 %d 格式说明符,它会将 c1 和 c2 的值当作整数来输出,所以输出 c1=97,c2=98 。
( 2 )输出结果:
原因:
char 类型通常是8位有符号整数(范围一般是 - 128到127)。当给 c1 赋值197时,197超出了 char 类型的表示范围。197的二进制表示为 11000101 ,截断到8位后是 11000101 ,这是一个负数的补码形式(最高位为1表示负数)。
计算补码对应的原码:补码 11000101 ,先减1得 11000100 ,再按位取反得 00111011 ,即十进制的59,所以这个补码表示的是 - 59。同理,198截断到8位后是 11000110 ,其补码对应的原码是58,即表示 - 58。
第一个 printf 函数使用 %c 格式说明符,由于 - 59和 - 58没有对应的可打印字符,所以输出 ? 。
第二个 printf 函数使用 %d 格式说明符,输出 c1=-59,c2=-58 。
( 3 )输出结果:
原因:
将 c1 和 c2 声明为 int 类型后,给 c1 赋值197, c2 赋值198,这两个值都在 int 类型的表示范围内(通常 int 类型的范围比 char 类型大得多)。
第一个 printf 函数使用 %c 格式说明符,197和198没有对应的可打印字符,所以输出 ? 。
第二个 printf 函数使用 %d 格式说明符,输出 c1=197,c2=198 ,即输出它们的整数值。