第1章习题解答 学习要点 完成主教材中的全部习题。 熟悉C语言程序设计考试的各种题型: 选择题、填空题、程序填空题、程序阅读题、编程题等。 注意综合运用C语言数据类型、语法特点、程序结构和典型算法。 1.1习题1参考答案和解释 1. 简答题 (1) 冯·诺依曼计算机模型有哪几个基本组成部分?各部分的主要功能是什么? 【参考答案】冯·诺依曼计算机模型是由运算器、控制器、存储器、输入设备、输出设备五大功能部件组成的。 运算器又称算术逻辑部件(Arithmetic and Logic Unit,ALU),是计算机用来进行数据运算的部件。数据运算包括算术运算和逻辑运算。 控制器是计算机的指挥系统,计算机就是在控制器的控制下有条不紊地协调工作的。 存储器是计算机中具有记忆功能的部件,用来存放程序或数据。 输入设备是用来输入程序和数据的部件。 输出设备正好与输入设备相反,是用来输出结果的部件。 (2) 简述计算机的工作原理。 【参考答案】计算机的工作原理可简单地概括为: 各种各样的信息,通过输入设备,进入计算机的存储器,然后送到运算器,运算完毕把结果送到存储器存储,最后通过输出设备显示出来。整个过程由控制器进行控制。 (3) 计算机软件系统分为哪几类? 【参考答案】软件内容丰富,种类繁多,通常根据软件用途将其分为两大类: 系统软件和应用软件。 系统软件是指管理、监控、维护计算机正常工作和供用户操作使用计算机的软件。这类软件一般与具体应用无关,是在系统一级上提供的服务。系统软件主要包括两类: 一类是面向计算机本身的软件,如操作系统、诊断程序等; 另一类是面向用户的软件,如各种语言处理程序(像Visual C++、CodeBlocks等)、实用程序、字处理程序等。 应用软件是指某特定领域中的某种具体应用,供最终用户使用的软件,它必须在操作系统的基础上运行,如财务报表软件、数据库应用软件等。 (4) 什么叫软件?说明软件与硬件之间的相互关系。 【参考答案】软件是指计算机程序及有关程序的技术文档资料。两者中更为重要的是程序,它是计算机进行数据处理的指令集,也是计算机正常工作最重要的因素。在不太严格的情况下,认为程序就是软件。 硬件和软件是一个完整的计算机系统互相依存的两大部分,它们的关系主要体现在以下几个方面: ① 硬件和软件互相依存。 硬件是软件赖以工作的物质基础,软件的正常工作是硬件发挥作用的唯一途径, 软件是用户与机器的接口。计算机系统必须要配备完善的软件系统才能正常工作,且充分发挥其硬件的各种功能。 ② 硬件和软件无严格界线。 随着计算机技术的发展,在许多情况下,计算机的某些功能既可以由硬件实现,也可以由软件来实现。因此,硬件与软件在一定意义上说没有绝对严格的界线。 ③ 硬件和软件协同发展。 计算机软件随着硬件技术的迅速发展而发展,而软件的不断发展与完善又促进硬件的更新,两者密切地交织发展,缺一不可。 (5) 什么叫机器数?为什么计算机中通常使用补码的形式来表示一个数? 【参考答案】计算机中的数是用二进制来表示的,数的符号也是用二进制来表示的。把一个数连同其符号在内在机器中的表示加以数值化,这样的数称为机器数。一般用最高有效位来表示数的符号,正数用0表示,负数用1表示。 计算机中通常是使用补码的形式来表示一个数,因为补码运算可以连同符号位一起参与运算,这便于运算器的设计和实现。 2. 填空题 (1) 运算器通常又称为ALU,是计算机用来进行数据运算的部件。数据运算包括算术运算和逻辑运算。 (2) 目前计算机最常用的输入设备有键盘和鼠标。 (3) 计算机的CPU主要是由控制器和运算器构成的。 (4) 十进制的基数为10,二进制的基数为2。 (5) 在C语言中,表示一个八进制数用前缀0标记,表示一个十六进制数用前缀0x或0X标记。 (6) 机器数的三种表示形式是原码、反码和补码。 (7) 十进制数23和-23的8位二进制补码分别是00010111和11101001。 (8) 用8位二进制补码表示有符号的定点整数,可表示的最大整数是127,最小整数是-128。 (9) 用16位二进制码表示无符号的定点整数,可表示的最大整数是65535,最小整数是0。 (10) 二进制的位运算主要有与运算、或运算、非运算和异或运算。 (11) 设x的二进制数是11001101,若想通过x&y运算使x中的低4位不变,高4位清零,则y的二进制数是00001111。 (12) 设x是一个整数(16b),若要通过x|y使x低8位置1,高8位不变,则y的八进制数是0377。 (13) 十六进制数F6.A转换成八进制数为366.5,转换成二进制数为11110110.101。 (14) (2345)9=(5036)7=(8022)6。 (15) 表达式0x13&0x17的十六进制值是0x13。 3. 选择题 (1) 计算机工作时,内存储器用来存储()。 A. 程序和指令B. 数据和信号 C. 程序和数据D. ASCII码和数据 【答案】C。 【解释】计算机内存按所存信息的类别一般分为两大类,即程序和数据。程序是用来控制计算机完成某项任务的指令的集合,而数据是程序运行处理的对象。A只说明是程序,B和D只说明是数据,因为信号和ASCII码均为数据,所以选C。 (2) 语言编译程序若按软件分类则是属于()。 A. 系统软件B. 应用软件 C. 操作系统D. 数据库管理系统 【答案】A。 【解释】软件根据其用途分为两大类: 系统软件和应用软件。各种语言的编译程序都属于系统软件。C和D都是具体的软件,均属于系统软件。所以选A。 (3) 在计算机内一切信息的存取、传输和处理都是以()形式进行的。 A. ASCII码B. 二进制C. 十进制D. 十六进制 【答案】B。 【解释】计算机只能识别二进制数。所有的信息(包括指令和数据)都是以二进制形式来存放,也是以二进制形式来进行处理的。所以选B。 (4) 十进制数35转换成二进制数是()。 A. 100011B. 0100011C. 100110D. 100101 【答案】A。 【解释】(35)10=(32)10+(3)10=(100000)2+(11)2=(100011)2,所以选A。 (5) 十进制数268转换成十六进制数是()。 A. 10BB. 10CC. 10DD. 10E 【答案】B。 【解释】(268)10=(256)10+(12)10=(100000000)2+(1100)2=(1 0000 1100)2=(10C)16,所以选B。 (6) 下列无符号整数中最大的数是()。 A. (10100011)2B. (FF)16C. (237)8D. 789 【答案】D。 【解释】(10100011)2=(163)10,(FF)16=(255)10,(237)8=(159)10 ,所以选D。 (7) 与二进制数0.1等值的十六进制小数为()。 A. (0.2)16B. (0.1)16C. (0.4)16D. (0.8)16 【答案】D。 【解释】(0.1)2=(0.1000)2=(0.8)16,所以选D。 (8) 真值为-100101的数在字长为8的机器中,其补码形式为()。 A. 11011011B. 10011011C. 10110110D. 10110111 【答案】A。 【解释】(-100101)原=10100101,故(-100101)补=11011011,所以选A。 (9) 若x补=0.1101010,则x原=()。 A. 1.0010101B. 1.0010110C. 0.0010110D. 0.1101010 【答案】D。 【解释】因x的符号位为0,所以x为正数,则x原与x补相同,所以选D。 (10) 若X=+1101,Y=-1011,则[X+Y]补=()。 A. 00010B. 100010C. 10010D. 00011 【答案】A。 【解释】[X+Y]补=[X]补+[Y]补=01101+10101=00010(其中最高符号位产生的进位丢掉),所以选A。 (11) 将250与5进行按位与的结果是()。 A. 0B. 1C. (FF)16D. (F0)16 【答案】A。 【解释】(250)10&(5)10=(11111010)2&(00000101)2=(00000000)2=(0)10,所以选A。 (12) 将(AF)16与(78)16进行按位异或的结果是()。 A. (D7)16B. (28)16C. (D8)16D. (27)16 【答案】A。 【解释】(AF)16∧(78)16=(10101111)2∧(01111000)2=(11010111)2=(D7)16,所以选A。 (13) 将(717)8进行按位求反的结果是()。 A. (110001)2B. (060)8C. (60)10D. 都不正确 【答案】B。 【解释】~(717)8=~(111001111)2=(000110000)2=(060)8,所以选B。 (14) 将二进制数10110010的最高位求反的操作是()。 A. 与(7F)16按位与B. 与(7F)16按位异或 C. 与(80)16按位或D. 都不正确 【答案】A。 【解释】A: (10110010)2&(7F)16=(10110010)2&(01111111)2=(00110010)2 B: (10110010)2∧(7F)16=(10110010)2∧(01111111)2=(11001101)2 C: (10110010)2|(80)16=(10110010)2|(10000000)2=(10110010)2 所以选A。严格来讲,应当是与(80)16按位异或为好。 (15) 将二进制数10110010的高4位求反,低4位不变的操作是()。 A. 与(0F)16按位与B. 与(F0)16按位异或 C. 与(0F)16按位异或D. 与(0F)16按位或 【答案】B。 【解释】高4位求反,可以将高4位与(1111)2进行按位异或得到; 低4位不变,可将低4位与(0000)2进行按位异或得到,故可与(11110000)2进行按位异或来实现题目的要求。所以选择B。其他均不正确。 (16) 以下表达式的值不一定为0的是( )。 A. m&~mB. m&0C. m∧mD. m|m 【答案】D。 【解释】A、B、C选项的值均为0。而m|m计算后的结果就是m,所以选D。 (17) 设ch的值为11011001,若要保留这一字节中的中间4位,而将高、低2位清零,则以下能实现此功能的表达式是()。 A. ch|074B. ch&074C. ch&0303D. ch|0303 【答案】B。 【解释】保留ch的中间4位,而将高、低2位清零,可将ch与二进制(00111100)2即八进制(074)8进行按位与的操作,所以选B。 (18) 表达式0x13&0x17的值是()。 A. 0x17B. 0x13C. 0xf8D. 0xec 【答案】B。 【解释】0x13&0x17=(0001 0011)2&(0001 0111)2=(0001 0011)2=0x13。所以选B。 (19) 计算机系统中,采用()可以将减法运算转换为加法运算。 A. 原码B. 补码C. 真值D. 反码 【答案】B。 【解释】因为(x-y)补=(x)补+(-y)补。所以选B。 (20) 计算机中的字符常用()编码方式来表示。 A. ASCIIB. 二进制C. 五笔字型D. 拼音 【答案】A。 【解释】在计算机内部,字符通常是由ASCII码来表示的。所以选A。 1.2习题2参考答案和解释 1. 简答题 (1) C语言有哪些特点? 【参考答案】 ① 简洁紧凑、灵活方便。 ② 运算符丰富。 ③ 数据结构丰富。 ④ C语言是结构式语言。 ⑤ C语言语法限制不太严格、程序设计自由度大。 ⑥ C语言允许直接访问物理地址,可以直接对硬件进行操作。 ⑦ C语言程序生成代码质量高,程序执行效率高。 ⑧ C语言适用范围大,可移植性好。 ⑨ 具有预处理功能。 ⑩ 具有递归功能。 (2) C语言的主要应用有哪些? 【参考答案】 ① 应用软件。Linux操作系统中的应用软件都是使用C语言编写的,因此这样的应用软件安全性非常高。 ② 服务器端开发。很多游戏或者互联网公司的后台服务器程序都是基于C/C++开发的,而且大部分是Linux操作系统,所以说,如果想做这样的工作,需要熟悉Linux操作系统及其在上面的开发,熟悉数据库开发,精通网络编程。 ③ 对性能要求严格的领域。一般对性能有严格要求的地方都是用C语言编写的,比如网络程序的底层和网络服务器端底层、地图查询、计算机通信等。 ④ 系统软件和图形处理。C语言具有很强的绘图能力和可移植性,并且具备很强的数据处理能力,可以用来编写系统软件(如UNIX、Linux等操作系统)、制作动画、绘制二维图形和三维图形等。例如,虚拟现实这个领域一直在发展,目前VR眼镜比较火,需要大量基于这些的C/C++开发。 ⑤ 数字计算。相对于其他编程语言,C语言是数字计算能力超强的高级语言。 ⑥ 嵌入式设备开发。手机、PDA等时尚消费类电子产品相信读者都不陌生,其内部的应用软件、游戏等很多都是采用C语言进行嵌入式开发的。 ⑦ 游戏软件开发。读者对游戏更不陌生,很多人就是由玩游戏而熟悉了计算机。利用C语言可以开发很多游戏,如推箱子、贪吃蛇等。 (3) 列举几种程序设计语言。 【参考答案】C语言、Java语言、C#语言、C++语言、Python语言等。 (4) 编写一个实现某种功能的C语言程序,必须经历哪几个步骤? 【参考答案】 ① C语言编程工具的安装。 ② 程序编辑。 ③ 程序编译。 ④ 程序连接。 ⑤ 程序运行。 (5) 说明一个C程序的组成结构。 【参考答案】C语言程序是由多个函数构成的; 每个C语言程序中有且只有一个main函数; main函数是程序的入口和出口; C语言程序中可加任意多的注释; 引用C语言标准库函数,一般要用文件包含预处理命令将其头文件包含进来; 用户自定义的函数,必须先定义后使用; 变量必须先定义后使用; 变量名、函数名必须是合法的标识符,标识符习惯用小写字母,C语言是字母大小写敏感的语言; 不能用关键字来命名变量和函数; 函数包含两个部分: 声明部分和执行部分,在C语言程序中,声明部分在前,执行部分在后,这两部分的顺序不能颠倒,也不能有交叉; C语言的语句都是以分号结尾。 2. 填空题 (1) 计算机程序设计语言的发展,经历了从机器语言、汇编语言到高级语言的历程。 (2) 计算机能唯一识别的语言是机器语言。 (3) C语言最初是在ALGOL 60语言的基础上发展而来的。 (4) C语言程序是由多个函数构成的。 (5) 每个C语言程序中有且只有一个main函数,它是程序的入口和出口。 (6) 引用C语言标准库函数,一般要用#include预处理命令将其头文件包含进来。 (7) 用户自定义的函数,必须先定义后使用。 (8) 用户自定义函数包含两个部分,即声明部分和执行部分。声明部分在前,执行部分在后,这两部分的顺序不能颠倒,也不能有交叉。 (9) 在C语言中,输入操作是由库函数scanf完成的,输出操作是由库函数printf完成的。 (10) C语言的源程序必须通过编译和连接后,才能被计算机执行。 3. 选择题 (1) C语言属于()。 A. 机器语言B. 低级语言C. 中级语言D. 高级语言 【答案】D。 【解释】机器语言是计算机唯一能识别的语言,是二进制语言,其他语言程序都必须将其编译为机器语言才能运行。低级语言是一种机器语言的符号化语言,如汇编语言。而其他语言一般是高级语言,C语言就是高级语言。所以选择D。 (2) C语言程序能够在不同的操作系统下运行,这说明C语言具有很好的()。 A. 适应性B. 移植性C. 兼容性D. 操作性 【答案】B。 【解释】所谓移植性就是在某操作系统下编写的程序能够在其他操作系统下编译运行,而程序几乎不需要做任何修改。所以选择B。 (3) 一个C语言程序是由()。 A. 一个主程序和若干子程序组成B. 函数组成 C. 若干过程组成D. 若干子程序组成 【答案】B。 【解释】C语言程序是由函数构成的。所谓函数,是指功能相对独立的可以反复执行的一段程序,在某些程序设计语言中也称为过程,但C语言中叫作函数。所以选择B。 (4) C语言规定,在一个源程序中,main函数的位置()。 A. 必须在最开始B. 必须在系统调用的库函数的后面 C. 可以任意 D. 必须在最后 【答案】C。 【解释】根据C语言的规定,任何程序有且仅有一个main函数,main函数可以出现在程序的任何地方,没有位置的限制。所以选择C。 (5) C语言程序的执行,总是起始于()。 A. 程序中的第一条可执行语句B. 程序中的第一个函数 C. main函数 D. 包含文件中的第一个函数 【答案】C。 【解释】在一个C语言源程序中,无论main函数书写在程序的前部还是后部,程序的执行总是从main函数开始,并且在main函数中结束。所以选择C。 (6) 下列说法中正确的是()。 A. C语言程序书写时,不区分大小写字母 B. C语言程序书写时,一行只能写一个语句 C. C语言程序书写时,一个语句可分成几行书写 D. C语言程序书写时,每行必须有行号 【答案】C。 【解释】C语言严格区分大小写字母,如A1和a1被认为是两个不同的标识符,C程序的书写非常灵活,既可以一行多句,又可以一句多行,且每行不加行号。所以选择C。 (7) 以下叙述不正确的是()。 A. 一个C源程序可由一个或多个函数组成 B. 一个C源程序必须包含一个main函数 C. C程序的基本组成单位是函数 D. 在C程序中,注释说明只能位于一条语句的后面 【答案】D。 【解释】C语言是由函数组成的,且有且仅有一个main函数,所以C语言程序的基本组成单位是函数。故A、B、C的说法都是正确的。对于C语言中的注释可以出现在一条语句的后面,也可以出现在一条语句或函数之前,故D是错误的。所以选择D。 (8) 下面对C语言的特点,描述不正确的是()。 A. C语言兼有高级语言和低级语言的双重特点,执行效率高 B. C语言既可以用来编写应用程序,又可以用来编写系统软件 C. C语言的可移植性较差 D. C语言是一种结构式模块化程序设计语言 【答案】C。 【解释】C语言是介于汇编语言和高级语言之间的一种语言,由于它可以直接访问物理地址,对硬件操作,所以C语言既可以编写应用程序,又可以开发系统软件,而且C语言程序可移植性好于汇编语言,程序清晰,具有模块化的特点。所以选择C。 (9) C语言源程序的最小单位是()。 A. 程序行B. 语句C. 函数D. 字符 【答案】D。 【解释】程序行、语句、函数都是由字符构成的,字符是C语言的最小单位。所以选择D。 (10) C语言程序的注释是()。 A. 由“/*”开头,“*/”结尾B. 由“/*”开头,“/*”结尾 C. 由“//”开头D. 由“/*”或“//”开头 【答案】A。 【解释】在标准C语言程序中,注释是由“/*”开头,由“*/”结尾。在C++程序中,也可以由“//”开头对单行进行注释。所以选择A。 (11) C语言程序的语句都是以()结尾。 A. “.”B. “;”C. “,”D. 都不是 【答案】B。 【解释】根据C语言的规定,在程序中所有的语句均必须由“;”结尾。所以选择B。 (12) 标准C语言程序的文件名的扩展名为()。 A. .cB. .cppC. .objD. .exe 【答案】A。 【解释】.c是标准C程序文件名的扩展名; .cpp则是C++程序文件名的扩展名; .obj是源程序经编译后所生成的目标文件的扩展名; .exe则是源程序经编译、连接后所生成的执行文件的扩展名。所以选择A。 (13) C语言程序经过编译以后生成的文件名的扩展名为()。 A. .cB. .objC. .exeD. .cpp 【答案】B。 【解释】C语言源程序经编译后生成目标(object)文件,其文件名扩展名为.obj。所以选择B。 (14) C语言程序经过连接以后生成的文件名的扩展名为()。 A. .cB. .objC. .exeD. .cpp 【答案】C。 【解释】C语言源程序经连接后生成可执行(execute)文件,其文件名扩展名为.exe。所以选择C。 (15) C语言编译程序的首要工作是()。 A. 检查C程序的语法错误B. 检查C程序的逻辑错误 C. 检查程序的完整性D. 生成目标文件 【答案】A。 【解释】C语言编译程序的首要工作就是检查C语言程序中是否存在语法错误,如果有则给出错误的提示信息,如果没有则生成目标文件(.obj)。编译程序对程序中的逻辑错误和程序的完整性是不检查的。所以选择A。 (16) C语言规定,必须用()作为主函数。 A. functionB. includeC. mainD. stdio 【答案】C。 【解释】根据C语言的规定,C语言程序中有且仅有一个主函数,且该主函数名为main,不能为别的名字。所以选择C。 (17) 以下叙述错误的是()。 A. 分号是C语句的必要组成部分 B. C程序的注释可以写在语句的后面 C. 函数是C程序的基本单位 D. 主函数的名字不一定用main表示 【答案】D。 【解释】根据C语言的规定,C语言程序中有且仅有一个主函数,且该主函数名为main,不能为别的名字。所以选择D。 (18) 以下叙述错误的是()。 A. 一个C源程序必须有且只能有一个主函数 B. 一个C源程序可以含零个或多个子函数 C. 在C源程序中注释说明必须位于语句之后 D. C源程序的基本结构是函数 【答案】C。 【解释】C语言程序是由函数构成的,可以包含零个或多个子函数,但一个C语言程序有且仅有一个main主函数; C语言程序中可以包含若干注释,注释可以位于语句的后面,也可以位于语句的前面。所以选择C。 (19) 一个C程序的执行是从()。 A. 本程序的main函数开始,到main函数结束 B. 本程序文件的第一个函数开始,到本程序文件的最后一个函数结束 C. 本程序的main函数开始,到本程序文件的最后一个函数结束 D. 本程序文件的第一个函数开始,到本程序main函数结束 【答案】D。 【解释】根据C语言的规定,程序的执行是从main函数开始(具体从“{”开始),到main函数结束(具体到“}”结束)。所以选择A。 (20) 以下叙述正确的是()。 A.在C程序中,main函数必须位于程序的最前面 B. C程序的每行中只能写一条语句 C. C语言本身没有输入输出语句 D. 在对一个C程序进行编译的过程中,可发现注释中的拼写错误 【答案】C。 【解释】C语言只能通过调用库函数(如scanf和printf)来完成数据的输入和输出,其本身没有输入输出语句。所以选择C。 1.3习题3参考答案和解释 1. 填空题 (1) 在C语言中,基本数据类型主要有整型、字符型、实型三种。 (2) 根据C语言标识符的命名规则,标识符只能由字母、 数字、下画线组成,而且第一个字符必须是字母或下画线。 (3) C语言中的常量分为直接常量和符号常量两种。定义符号常量需要使用预处理命令#define。 (4) 在C语言中,八进制整型常量以0作为前缀,十六进制整型常量以0x或0X作为前缀。 (5) 在C语言中,一个char型数据在内存中所占的字节数为1; 一个short型数据在内存中所占的字节数为2。 (6) 在C语言中,一个float型数据在内存中所占的字节数为4; 一个double型数据在内存中所占的字节数为8。 (7) C语言中,short型数据的取值范围为-32768~+32767。 (8) 已知int m=5, y=2;,则计算表达式y+=y-=m*=y后的y值是-16。 (9) 语句: x++; ++x; x=x+1; x=l+x;,执行后都使变量x中的值增1,请写出一条同一功能的赋值语句(不得与列举的相同)x +=1;。 (10) 若a为整型变量,则表达式“(a=4*5,a*2),a+6”的值为26。 (11) 假设m是一个三位数,从左到右用a, b, c表示各位的数字,则从左到右各个数字是bac的三位数的表达式是(m/10)%10*100+m/100*10+m%10。 (12) 若有以下定义语句: int u=010, v=0x10, w=10; printf("%d,%d,%d\n",u,v,w); 则输出结果是8,16,10。 (13) 求解赋值表达式a=(b=10)%(c=6),a、b、c的值依次为4、10、6。 (14) 设float x=2.5, y=4.7; int a=7;,则表达式x+a%3*(int)(x+y)%2/4的值为2.5。 (15) 若有定义: int a=2, b=3; float x=3.5, y=2.5;,则表达式(float)(a+b)/2+(int)x%(int)y的值为3.500000。 (16) 表达式8/4*(int)2.5/(int)(1.25*(3.7+2.3))值的数据类型为整型(或int型)。 (17) 已知: int a=5;,则执行a+=a-=a*a; 语句后,a的值为-40。 (18) 设有int a,b; a=100; b=20; a+=200; b*=a-100;,则a=300,b=40000。 (19) 在C语言源程序中,一个变量代表内存中的一个存储单元。 (20) 若t为double型变量,表达式t=1, t+5, t++的值是1.0。 2. 选择题 (1) 在C语言系统中,double、long、int、char类型数据所占字节数分别是()。 A. 8,2,4,1B. 2,8,4,1C. 4,2,8,1D. 8,4,4,1 【答案】D。 【解释】在Visual C++和CodeBlocks下,C语言系统中,double型数据占8B,long型数据占4B,int型数据占4B,char型数据占1B。所以选择D。 (2) 下面四个选项中,均是不合法的用户标识符的选项是()。 A. AP_0 doB. floatla0 _A C. basizeof intD. _123tempint 【答案】C。 【解释】根据C语言中对标识符的规定: A选项中的A、P_0是合法的,do是关键字,为非法的; B选项中la0、_A是合法的,float是关键字,为非法的; C选项中ba非法,因“”不是标识符中的有效字符,sizeof和int均是关键字,为非法的; D选项中_123、temp是合法的,int是关键字,为非法的。故只有C全错。所以选择C。 (3) 下面四个选项中,均是合法整型常量的选项是()。 A.160-0xffff 011B. -0xcdf 01a 0xe C. -01986,012 0668D. -0x48a 2e5 0x 【答案】A。 【解释】A中160是十进制数,-0xffff是十六进制数,011是八进制数,均合法; B中01a非法,因为a不是八进制数码; C中986,012非法,不能包含“,”,0668非法,因为8不是八进制数码; D中0x非法,因为后面没有有效的十六进制数码。所以选择A。 (4) 下面四个选项中,均是不合法的浮点数的选项是()。 A. 160.0.12e3B. 1232e4.2.e5 C. -.18123e4 0.0D. -e3.234 1e3 【答案】B。 【解释】C语言中的浮点数有两种形式,一种为十进制小数形式,一种为指数形式,其一般形式为a E n,a为十进制数,n为十进制整数,都不可省略。A选项中e3非法,因为只有阶码3没有尾数,其余两数都是合法的浮点数; B选项中123是整数,不是浮点数,2e4.2阶码部分4.2是浮点数,不是整数,故是非法的,.e5尾数部分不能只有小数点,也是非法的; C选项中的三个数均是合法的浮点数; D选项中的.234和1e3也是合法的,只有-e3非法。所以选择B。 (5) 下面四个选项中,均是不合法的转义字符的选项是()。 A. '\"' '\\''\xf'B. '\1011''\' '\ab' C. '\011''\f''\}'D. '\abc''\101''xlf' 【答案】B。 【解释】A选项中均为合法的转义字符; B选项中'\1011'的\后面多于3位八进制数是非法的, '\'不能标识\字符,是非法的,'\ab'的\后面漏掉了x是非法的; C选项中'\011'是合法的; D选项中'\101'是合法的; 故都不合法的只有B选项。所以选择B。 (6) 下面四个选项中,均是正确的数值常量或字符常量的选项是()。 A. 0.0of 8.9e '&'B. "a"3.9e-2.51e1'\"' C. '3'0110xff000aD. +001 0xabcd2e250. 【答案】D。 【解释】A选项中of、8.9e是非法的数值常量; B选项中"a"是字符串常量,是非法的数值常量或字符常量; C选项中0a是非法的数值常量; D选项中均是合法的数值常量。所以选择D。 (7) 下面程序段输出结果是()。 int i = 5, k; k = (++i) + (++i) + (i++); printf ("%d,%d", k, i); A. 24,8B. 21,8C. 21,7D. 24,7 【答案】B。 【解释】k=(++i)+(++i)+(i++)表达式中,"++"号在i前面的有两个,所以在计算k之前,i要先增两次,即i变为7,然后再将3个7相加,使得k的值为21,表达式中"++"号在i后面的有1个,所以得出k的值以后i又增1次变为8。所以正确答案为B。 (8) 下面程序段输出结果是()。 short int i = 32769; printf ("%d\n", i); A. 32769B. 32767 C. -32767D. 输出不是确定的数 【答案】C。 【解释】因为(32769)10=(1000 0000 0000 0001)2,所以i的值在内存中以补码形式表示为1000 0000 0000 0001,最高位是1表示负数,其表示的有符号数是-(0111 1111 1111 1111)2,即十进制数-32767。所以正确答案是C。 (9) 若有说明语句: char c='\72';,则变量c()。 A. 包含1个字符B. 包含2个字符 C. 包含3个字符D. 说明不合法,c的值不确定 【答案】A。 【解释】因为'\72' 是转义字符,表示其ASCII码为八进制数72的字符,即':'字符,所以正确答案是A。 (10) 若有定义: int a=7; float x=2.5, y=4.7;,则表达式x+a%3*(int)(x+y)%2/4的值是()。 A. 2.500000B. 2.750000C. 3.500000D. 0.000000 【答案】A。 【解释】本题考查运算符的优先级概念,式中要先算(x+y)的值,再进行强制类型变换,*、/、%是同级的运算符,要从左到右计算,最后做加法。所以正确的结果是A。 (11) 设变量a是整型,f是实型,i是双精度型,则表达式10+'a'+i * f值的数据类型为()。 A. intB. floatC. doubleD. 不确定 【答案】C。 【解释】不同类型数据混合运算的转换规律是: 运算前float型数据会自动转换为double型,char型数据会自动转换为int型。运算时int型数据和double型数据要先转换为相同类型,即double型,运算结果也为double型。所以正确答案为C。 (12) sizeof (float)是()。 A. 一个双精度型表达式B. 一个整型表达式 C. 一种函数调用D. 一个不合法的表达式 【答案】B。 【解释】sizeof是计算某数据类型的变量所占内存大小的运算符,其值是占用内存的字节数,为一整型值,所以正确答案是B。 (13) 设变量n为float类型,m为int类型,则以下能实现将n中的数值保留小数点后两位,第三位进行四舍五入运算的表达式是()。 A. n=(n*100+0.5)/100.0B. m=n*100+0.5,n=m/100.0 C. n=n*100+0.5/100.0D. n=(n/100+0.5)*100.0 【答案】B。 【解释】要实现将n中的数值保留小数点后两位,第三位进行四舍五入,则首先可将n乘以100,此时n*100的最低两位整数将是n的前两位小数,n*100的第一位小数将是n的第三位小数,再将n*100加上0.5,如果n*100的第一位小数(即n的第三位小数)大于或等于0.5,则整数部分加1,否则整数部分不变,然后再将结果赋值给一整型变量其实就是将n*100+0.5的整数部分赋值给整型变量,从而完成了n的第三位小数的四舍五入操作,再将该整型变量除以100.0就得到了所希望的结果。所以正确答案是B。 (14) 在C语言中,要求运算数必须是整型的运算符是()。 A. /B. ++C. !=D. % 【答案】D。 【解释】/、++、!=运算符都可以对浮点数进行运算,但%只能对整型数据进行运算。所以应选择D。 (15) 若变量已正确定义并赋值,下面符合C语言语法的表达式是()。 A. a:=b+1B. a=b=c+2C. int 18.5%3D. a=a+7=c+b 【答案】B。 【解释】赋值运算符=的左边必须是变量,不能是表达式,所以D选项是非法的; 对于C选项来说,int丢掉了括号,应写成(int)18.5%3,所以也是错误的; A选项中的:=是非法的运算符。而B选项的功能是将c+2的值赋值给b,再将b的值赋值给a,是正确的。所以应选择B。 (16) 若有定义: int k=7, x=12;,则能使值为3的表达式是()。 A. x%=(k%=5) B. x%=(k-k%5) C. x%=k-k%5D. (x%=k)-(k%=5) 【答案】D。 【解释】A选项的计算结果为6; B选项的计算结果为2; C选项的计算结果为2; D选项的计算结果为3,因为(x%=k)的结果是5,而(k%=5)的结果是2; 所以应选择D。 (17) 若变量a、i已正确定义,且i已正确赋值,合法的语句是()。 A. a==1B. ++i;C. a=a++=5; D. a=int (i); 【答案】B。 【解释】A选项是关系表达式,不是C语句; C选项中的a++是表达式,不能出现在赋值运算符的左边,故是非法的; D选项中int不可作为函数名,应写为(int)i的形式; B选项是将i的值增1,是合法的。所以应选择B。 (18) 若有如下程序 int main ( ) { int y=3,x=3,z=1; printf("%d%d\n",(++x,y++),z+2); return 0; } 运行该程序的输出结果是()。 A. 3 4B. 42C. 4 3D. 3 3 【答案】D。 【解释】逗号表达式的求值顺序是从左向右依次计算用逗号分隔的各表达式的值,最后一个表达式的值就是整个逗号表达式的值,所以(++x, y++)的值将是y++,因为是先输出y的值,再将y增1,所以首先输出3,再输出z+2的值,即3。所以应选择D。 (19) 下面正确的字符常量是()。 A. "c"B. '\\"C. 'W'D. '' 【答案】C。 【解释】C语言中的字符常量必须是由单引号括起来的字符。A选项表示的是一字符串常量,不是字符常量; B选项中右边不是单引号,是错误的; D选项中单引号之间没有任何字符也是非法的; C选项表示的是W字符,是正确的。所以应选择C。 (20) 在C语言中,5种基本数据类型的存储空间长度的排列顺序为()。 A. char<int<=long int<=float<double B. char=int<=long int<=float<double C. char<int<=long int=float=double D. char=int=long int<=float<double 【答案】A。 【解释】在Visual C++或CodeBlocks下,char类型占1B,int占4B,long int占4B,float占4B,double占8B。所以正确答案是A。 (21) 假设所有变量均为整型,则表达式(a=2, b=5, b++, a+b)的值是()。 A. 7B. 8C. 6D. 2 【答案】B。 【解释】逗号表达式的求值顺序是从左向右依次计算用逗号分隔的各表达式的值,最后一个表达式的值就是整个逗号表达式的值。所以表达式最后的值是a+b,但经过前面的计算此时a的值为2,b的值是6,所以最后的结果是8,应选择B。 (22) 以下正确的叙述是()。 A. 在C语言程序中,每行中只能写一条语句 B. 若a是实型变量,C语言程序中允许赋值a=10,因此实型变量中允许存放整型数 C. 在C语言程序中,无论是整数还是实数,都能被准确无误地表示 D. 在C语言程序中,%是只能用于整数运算的运算符 【答案】D。 【解释】在C语言程序中,每行中可以写多行语句,故A选项的说法错误; 整型数可以赋值给实型变量,其实是将整数转换成实型数后再赋值给实型变量的,并不是实型变量中允许存放整型数,故B选项也是错误的; 在C语言程序中,整型数据可以准确地表示,但实数因有其精度的限制,不可能准确无误地表示,故C选项也是错误的; %运算符只能用于整数的运算,所以D选项是正确的。 (23) 假定x和y为double型,则表达式x=2, y=x+3/2的值是()。 A. 3.500000B. 3C. 2.000000D. 3.000000 【答案】D。 【解释】逗号表达式的值是最后一个表达式的值,即y=x+3/2的值,因x的值是2.000000,3/2的值是1,所以y的值是3.000000,应选择D。 (24) 以下程序的输出结果是()。 int main ( ) { int a = 3; printf ("%d\n", (a+=a-=a*a) ); return 0; } A. -6B. 12C. 0D. -12 【答案】D。 【解释】a+=a-=a*a等价于a=a+(a=a-a*a),即先计算a=a-a*a,所以此时a的值为3-3*3=-6,再计算-6+(-6)=-12赋值给a,所以a的值为-12,也就是整个表达式的值,所以应选择D。 (25) 已知各变量的类型说明如下: int k, a, b; unsigned long w=5; double x=1.42;,则以下不符合C语言语法的表达式是()。 A. x%(-3)B. w+=-2 C. k=(a=2,b=3,a+b)D. a+=a-=(b=4)*(a=3) 【答案】A。 【解释】取余(%)运算符要求被除数和除数只能是整数,不能是浮点数,因为变量x是double型数据,所以A是错误的。应选择A。 (26) 若变量a是int类型,并执行了语句: a='A'+1.6; ,则正确的叙述是()。 A. a的值是字符CB. a的值是浮点型 C. 不允许字符型和浮点型相加D. a的值是字符'A'的ASCII值加上1 【答案】D。 【解释】a='A'+1.6; 其功能是将字符'A'的ASCII的值加上1.6,然后将运算结果的整数部分赋值给整型变量a,所以a的值是字符'A'的ASCII值加上1。正确答案为D。 (27) 语句printf ("a\bre\'hi\'y\\\bou\n"); 的输出结果是()。 A. a\bre\'hi\'y\\\bouB. a\bre\'hi\'y\bou C. re'hi'youD. abre'hi'y\bou 【答案】C。 【解释】首先要明确该字符串中包含的转义字符,"a \b re \' hi \' y \\ \b ou \n"中的转义字符(带下画线的部分)共有6个,其中,'\b'是退格符,输出时将光标往左边回退一个位置,'\''为单引号字符,'\\'为\字符,'\n'为回车换行符。所以显示的结果为C。 (28) 下列程序执行后的输出结果是()。 int main ( ) { int x = 'f'; printf("%c \n", 'A'+(x-'a'+1)); return 0; } A. GB. HC. ID. J 【答案】A。 【解释】因为x为'f',所以x-'a'+1的值为6,'A'+6对应的是'G',所以输出的结果是A。 (29) 下列程序执行后的输出结果是()。 int main ( ) { char x = 0xFFFF; printf ("%d \n", x--); return 0; } A. -32767B. FFFEC. -1D. -32768 【答案】C。 【解释】因为x是字符型,所以将0xFFFF赋值给x,x的值为0xFF,因为数据在内存中是其补码表示的,0xFF的真值是-1,所以显示的结果是-1,即正确答案为C。 (30) 已知: int x=1, y=-1;,则语句printf("%d\n", (x-- & ++y));的输出结果是()。 A. 1B. 0C. -1D. 2 【答案】B。 【解释】x-- & ++y是将x的值1与++y的值0进行按位与操作,其结果显然是0。所以正确答案为B。 3. 阅读题 (1) 执行下列程序的输出结果是。 int main( ) { int x=5,y; y=++x*++x; printf("y=%d\n",y); return 0; } 【答案】49 【解释】变量x做前置++运算两次,因此x的值将增2,即x的值为5+2=7,y=7*7=49。 (2) 执行下列程序的输出结果是。 int main( ) { float a=1,b; b=++a*++a; printf("%f\n", b); return 0; } 【答案】9.000000 【解释】变量a做前置++运算两次,因此a的值将增2,即a的值为1.0+2=3.0,y=3.0*3.0=9.000000。 (3) 下面程序的输出结果是。 int main( ) { short int x=-32769; printf("%d\n", x); return 0; } 【答案】32767 【解释】(-32769)补=(1 0111 1111 1111 1111)2,因x是短整型变量,占用内存为两字节,即16个二进制位,所以x的值将是(-32769)补的低16位,即为(0111 1111 1111 1111)2=(32767)10,所以输出结果为32767。 (4) 以下程序的输出结果是。 int main( ) { unsigned short a=65536; int b; printf("%d\n",b=a); return 0; } 【答案】0 【解释】(65536)补=(01 0000 0000 0000 0000)2,因a是无符号短整型变量,占用内存为两字节,即16个二进制位,所以a的值将是(65536)补的低16位,即为(0000 0000 0000 0000)2=(0)10,所以输出结果为0。 (5) 以下程序的输出结果是。 int main( ) { unsigned char x, y, z; x=0x3; y=x | 0x8; z=x<<1; printf("%d, %d\n", y, z); return 0; } 【答案】11, 6 【解释】y=x|0x8=0x3|0x8=(0011)2|(1000)2=(1011)2=(11)10,z=x<<1=(0011)2<<1=(110)2=(6)10。 (6) 以下程序的运行结果是。 int main( ) { char a=0x95, b, c; b=(a&0xf)<<4; c=(a&0xf0)>>4; a=b|c; printf("%x\n", a); return 0; } 【答案】59 【解释】b=(a&0xf)<<4=(0x95&0xf)<<4=(10010101&00001111)<<4=00000101<<4=01010000,c=(a&0xf0)>>4=(0x95&0xf0)>>4=(10010101&11110000)>>4=10010000>>4=11111001,a=b|c=01010000|11111001=01011001=0x59。 (7) 以下程序的运行结果是。 int main( ) { unsigned short a, b; a=0x9a; b=~a; printf("a=%x b=%x\n", a, b); return 0; } 【答案】a=9ab=ff65 【解释】a=0x9a=(0000 0000 1001 1010)2,b=~a=~(0000 0000 1001 1010)2=(1111 1111 0110 0101)2=0xff65。 (8) 下面程序段的输出结果是。 int main( ) { int k=10; float a=3.5, b=6.7, c; c=a+k%3*(int)(a+b)%2/4; printf("%f\n", c); return 0; } 【答案】3.500000 【解释】k%3=10%3=1,(int)(a+b)=(int)(3.5+6.7)=10,k%3*(int)(a+b)%2/4=1*10%2/4=0/4=0,故c=a+k%3*(int)(a+b)%2/4=3.5+0=3.500000。 (9) 下面程序段的输出结果是。 int main( ) { char ch; short int a = -32768, c; unsigned long b = 0xffffaa00; ch = a; c = b; printf("ch=%d, c=%hx\n",ch,c); return 0; } 【答案】ch=0, c=aa00 【解释】a=(-32768)补=(1000 0000 0000 0000)2,ch占一字节的内存单元,执行ch=a;后,将把a的低字节赋值给ch,故ch的值为0; c和b分别占两个节和四字节的内存单元,执行c=b;后,将把b的低两字节赋值给c,故c的值为0xaa00。 (10) 下面程序段的输出结果是。 int main( ) { char a='\x41'; printf("%c,%c,%d,%d", a, a+1, a, a+1); return 0; } 【答案】A, B, 65, 66 【解释】'\x41'就是字符'A'的转义字符,printf中%c表示以字符形式输出,%d表示以十进制形式输出字符的ASCII码。