第12题  设有下面程序

c_choice12-01

若执行时输入 BCDEFGH∗∗回车键,则程序执行后的输出结果是

­      A    ABCDEFG

­      B    ABCDEFG)

­      C    ABCDEFG+

­      D    BCDEFGH

答案  A

解析

考查库函数getchar和putchar的应用。如果理解或记住了下面的知识点,就不难选择。

知识点

① for语句的格式:

­          for (表达式1;表达式2;表达式3)    循环体语句

② for语句的执行规则:

­      计算表达式1的值(仅1次),为循环做准备。计算表达式2的值,若表达式2的值不为0,则执行循环体语句,然后计算表达式3的值。再次计算表达式2的值,如此重复,直到表达式2的值变为0时循环结束。若第1次计算测试表达式2的值就为0,则根本不会进入循环(既不会执行循环体,也不会计算表达式3)。

若省略表达式1或表达式3,则不计算、无动作。

若省略表达式2,则视为非0常量、引起无限循环。这种无限循环一般通过语句break、return等手段来打破。

③ 声明

­        int  c;

定义整型变量c,在字符输入输出过程中,用来暂存字符的值。因为库函数getchar和putchar均采用int类型处理字符,所以声明变量c为int类型以保持一致。写作char c;是不严谨的,当面临文件尾时,getchar就会返回一个与所有可能的字符值均不相同的特殊值EOF。为了容纳EOF,应使用int类型。char类型用于声明字符数组,char ∗类型用于声明字符指针来处理字符数组或字符串。

④ getchar的原型是

­        int  getchar(void)

从标准输入设备(通常是键盘)读取下一个字符,把该字符的值视为unsigned char类型,再转换为int类型的值并返回。

⑤ putchar的原型是

­        int  putchar(int c)

int类型的形参变量c的值转换为unsigned char类型的值,并送标准输出设备(通常是显示器)输出。若发生错误,则返回EOF,否则返回c的原值。

⑥ 在本题程序中,只执行下面一条for语句

­              for (; (c = getchar()) != ′∗′;)
­                     putchar(−−c);

因表达式1和表达式3缺省,故不计算、无动作。该for语句等价于下面while语句

­              while ( (c = getchar()) != ′∗′ )
­                     putchar(−−c);

调用getchar从标准输入设备(通常是键盘)读取下一字符于变量c,再将c减1得到其在字符集中的前邻字符,并调用putchar把所得前邻字符送标准输出设备(通常是显示器)输出,例如,读到B后输出A,读到C后输出B……

这个过程反复进行,直至读取到字符∗时循环结束。∗的前邻字符)不会被输出,因为读取到字符∗时,循环控制表达式(c = getchar()) != ′∗′的值为假,不再执行putchar(−−c);。因为本题输入为BCDEFGH∗∗回车键,所以输出结果是ABCDEFG

下面分析关系表达式(c = getchar()) != ′∗′的求值过程。先调用库函数getchar读取下一字符,再赋值于变量c,再将变量c的值作为赋值表达式c = getchar()的结果值,再拿该结果值,即刚读到的字符值与字符′∗′比较,若不相等,则关系表达式(c = getchar()) != ′∗′的值为1(视为真),执行循环体,否则为0(视为假),结束循环。因为getchar无需参数,故其后圆括号为空。因赋值运算符=的优先级低于关系运算符!=,故为赋值表达式c = getchar()加了括号。若不加括号,则

­          c = getchar() != ′∗′  等价于  c = (getchar() != ′∗′)

会导致程序语义错误,得到错误的执行结果,值得一试!

⑦ 在C语言中,在赋值表达式后面添加分号,就变成了赋值语句,这是两个概念。赋值表达式的结果值就是赋值号左部被赋于的那个值。

⑧ 对于关系表达式,若关系成立,则结果值为1,否则结果值为0。

⑨ 在C语言中,将非0值视同逻辑真,将0值视同逻辑假。

⑩ 在ASCII字符集中,26个英文字母和10个十进制数字都是连续相邻的,∗的前邻是),后邻是+

练习题

试为自己设计一道孪生题,举一反三。

孪生题  设有下面程序

c_choice12-02

若执行时输入 ABCDEFG∗∗回车键,则程序执行后的输出结果是

­      A    ABCDEFG

­      B    ABCDEFG)

­      C    BCDEFGH+

­      D    BCDEFGH

答案  D

分析:

调用getchar从标准输入设备(通常是键盘)读取下一字符于变量c,再将c加1得到其在字符集中的后邻字符,并调用putchar把所得后邻字符送标准输出设备(通常是显示器)输出,例如,读到A后输出B,读到B后输出C……

这个过程反复进行,直至读取到字符∗时循环结束。∗的后邻字符+不会被输出,因为读取到字符∗时,循环控制表达式(c = getchar()) != ′∗′的值为假,不再执行putchar(++c);。因为本题输入为ABCDEFG∗∗回车键,所以输出结果是BCDEFGH

返回