谭浩强《C程序设计》(第4版)章节专项练习及详解
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2章 算法——程序的灵魂

1以下叙述中正确的是(  )。

A.在C语言程序中,main函数必须放在其他函数的最前面

B.每个后缀为.c的C语言源程序都可以单独进行编译

C.在C语言程序中,只有main函数才可以单独进行编译

D.每个后缀为.c的C语言源程序都应该包含一个main函数

【答案】B

【解析】main函数可以在程序的任何位置。每一个可执行的C程序都必须有一个且只能有一个主函数。后缀名为.c的C语言源程序都可以单独进行编译。main函数只是让执行程序的系统知道该从哪里开始执行程序(从主函数处执行),其他有关这个程序的子函数是通过函数调用来实现其功能(不需main函数)。答案选择B选项。

2以下叙述中错误的是(  )。

A.C语言编写的函数源程序,其文件名后缀可以是.c

B.C语言编写的函数都可以作为一个独立的源程序文件

C.C语言编写的每个函数都可以进行独立的编译并执行

D.一个C语言程序只能有一个主函数

【答案】C

【解析】C源程序经过C编译程序编译之后生成一个后缀为.obj的二进制文件(称为目标文件),然后由称为“连接程序”(Link)的软件,把此.obj文件与C语言提供的各种库函数连接起来生成一个后缀为.EXE的可执行文件。只有含有main函数的经过编译链接才能执行。答案选择C选项。

3以下叙述中错误的是(  )。

A.一个C程序可以包含多个不同名的函数

B.一个C程序只能有一个主函数

C.C程序在书写时,有严格的缩进要求,否则不能编译通过

D.C程序的主函数必须用main作为函数名

【答案】C

【解析】一个C程序有且只有一个主函数main。一个C程序可以包含多个不同名字的子函数。C程序在书写时没有严格的缩进要求。答案选择C选项。

4以下叙述中正确的是(  )。

A.C语言规定必须用main作为主函数名,程序将从此开始执行

B.可以在程序中由用户指定任意一个函数作为主函数,程序将从此开始执行

C.C语言程序将从源程序中第一个函数开始执行

D.main的各种大小写拼写形式都可以作为主函数名,如:MAIN,Main等

【答案】A

【解析】用户不能指定某函数为主函数,C语言规定,程序从main函数开始执行,从main函数退出,C语言函数名区别大小写。答案选择A选项。

5下列叙述中错误的是(  )。

A.C程序可以由一个或多个函数组成

B.C程序可以由多个程序文件组成

C.一个C语言程序只能实现一种算法

D.一个C函数可以单独作为一个C程序文件存在

【答案】C

【解析】一个C程序可以有一个或多个程序文件,也可以有一个或多个函数,所以一个C语言程序可以实现多种算法,答案选择C选项。

6下列叙述中错误的是(  )。

A.C程序在运行过程中所有的计算都以二进制方式进行

B.C程序在运行过程中所有的计算都以十进制方式进行

C.所有的C程序都需要在连接无误后才能运行

D.C程序中整型变量只能存放整数,实型变量只能存放浮点数

【答案】B

【解析】在C程序运行过程中,编译器的作用是将程序转换为目标代码,目标代码都是二进制的。答案选择B选项。

7以下叙述正确的是(  )。

A.C语言程序是由过程和函数组成的

B.C语言函数可以嵌套调用,例如:fun(fun(x))

C.C语言函数不可以单独编译

D.C语言中除了main函数,其他函数不可作为单独文件形式存在

【答案】B

【解析】一个函数的返回值可以作为参数然后传给另一个函数,因此函数是可以嵌套调用的。A项错误,C语言程序只有函数构成,没有过程;C项错误,编译系统的任务在于检查语法错误,只要符合语法规则的C程序都可以通过编译,就算是单独的函数也可以;D项错误,在C语言中除main()函数以外的其他函数可以和main()函数在同一个C文件中,也可以单独处于其他的C文件,只要在使用到这些函数的main()函数的C文件中用预编译指令“#include”包含进来即可。答案选择B选项。

8对于一个正常运行的C程序,以下叙述中正确的是(  )。

A.程序的执行总是从程序的第一个函数开始,在main函数结束

B.程序的执行总是从main函数开始

C.程序的执行总是从main函数开始,在程序的最后一个函数中结束

D.程序的执行总是从程序的第一个函数开始,在程序的最后一个函数中结束

【答案】B

【解析】一个正常运行的C程序总是从main函数开始执行,最后返回到main函数结束。答案选择B选项。

9下列叙述中正确的是(  )。

A.每个C程序文件中都必须要有一个main函数

B.在C程序中main函数的位置是固定的

C.C程序中所有函数之间都可以相互调用

D.在C程序的函数中不能定义另一个函数

【答案】D

【解析】在C程序中,main函数的位置可以任意,而且不管main函数位置怎么变化,程序都会以main函数作为入口,选项B错误;每个C程序(而不是每个C程序文件)必须有且只能有一个main函数,选项A错误;main函数不能被其他函数调用,选项C错误;函数的定义不能放在另一个函数体内,但是声明可以,答案选择D选项。

10以下叙述正确的是(  )。

A.C程序总是以main()作为程序执行的起始行

B.main()函数若不带参数,其后面的一对圆括号可省略

C.函数体内的定义语句和可执行语句允许任意穿插出现

D.C语言中的语句之间必须用分号作为分隔符

【答案】A

【解析】main函数后面的括号告诉编译器这是一个函数,不可以省略,排除B选项;在复合语句中,不仅可以有执行语句,还可以有定义语句,定义语句应该出现在执行语句的前面,故排除C选项;C语言中的某些语句可以不用分号,例如if语句,宏定义,故D选项错误。答案选择A选项。

11以下关于C语言的叙述中正确的是(  )。

A.C语言中的注释不可以夹在变量名或关键字的中间

B.C语言中的变量可以在使用之前的任何位置进行定义

C.在C语言算术表达式的书写中,运算符两侧的运算数类型必须一致

D.C语言的数值常量中夹带空格不影响常量值的正确表示

【答案】A

【解析】A项正确,C语言中,程序中的注释可以出现在程序中任何合适的地方,但是,不能写在变量名或关键字的中间,一旦写在其中间,将会失去变量名或关键字的意义,导致报错;B项错误,条件没有说全,应该是在有效的范围内,变量可以在任何位置定义,例如注释中定义无效。C项错误,在C语言的算术运算符中,取余运算符“%”的两个运算分量必须是整数,但对于其他运算符,如“+”,“-”来说,两侧的运算符类型也可以不一样,例如左侧为一个字符类型,右侧为一个整数类型,系统在执行程序时会自动将字符类型转换为ASCII值进行运算;D项错误,C语言的数值表示时各个数位必须紧靠在一起,否则编译系统只会识别紧靠运算符的一部分数值,另一部分数值会发生语法错误。答案选择A选项。

12以下叙述中正确的是(  )。

A.C程序的基本组成单位是语句

B.C程序中的每一行只能写一条语句

C.简单C语句必须以分号结束

D.C语言必须在一行内写完

【答案】C

【解析】C程序的基本组成单位是函数,A项错误;C程序以分号作为每个语句结尾,一行能写多条语句,也可以将一条语句分几行书写,B、D两项错误;C语言中语句分为简单语句和复合语句。简单语句以分号作为结束。其中简单语句里面又有赋值语句、声明语句、结构化语句、函数调用语句和空语句。复合语句指用花括号{}将简单语句甚至另一些复合包起来,所以就以}作为语句结束的标记。答案选择C选项。

13以下选项中叙述正确的是(  )。

A.函数体必须由{开始

B.C程序必须由main语句开始

C.C程序中的注释可以嵌套

D.C程序中的注释必须在一行完成

【答案】A

【解析】函数体是函数首部下面的花括号内的部分,所以函数体必须由{开始,A选项正确。一个源程序文件可以包括预处理命令、全局声明、函数定义,程序总是从main函数开始执行的,不是main语句,B选项错误。函数可以嵌套,注释不能嵌套,C选项错误。C程序中允许两种注释,以//开头的单行注释;以/*开始,以*/结束的块式注释,D选项错误。答案选择A选项。

14以下叙述中正确的是(  )。

A.C程序中的注释只能出现在程序的开始位置和语句的后面

B.C程序书写格式严格,要求一行内只能写一个语句

C.C程序书写格式自由,一个语句可以写在多行上

D.用C语言编写的程序只能放在一个程序文件中

【答案】C

【解析】C程序的注释可以出现在C程序的任何位置,注释符号:“//”或“/*…*/”,选项A错误。C程序中,一行内可写多个语句,每条语句用分号“;”结束,选项B错误,选项C正确。用C语言编写的程序可以放在多个程序文件中,用#include命令行实现文件包含功能,选项D错误。答案选择C选项。

15以下叙述中错误的是(  )。

A.书写风格良好的程序执行效率高

B.书写风格良好的程序易读性好

C.C程序可以在一行上写多条语句

D.C程序允许将一条语句分写在多行上

【答案】A

【解析】书写风格与程序执行效率无关,程序执行效率与程序的数据结构有关,由算法的时间复杂度和空间复杂度决定,但书写风格会深刻地影响软件的质量和可维护性,良好的程序设计风格可以使程序结构清晰合理。良好的书写习惯一般一行写一条语句,这样方便阅读,但是一行写多条语句或者将一条语句分写在多行上是符合C程序编写规则的。答案选择A选项。

19以下四个程序中,完全正确的是(  )。

A.

#include <stdio.h>
main()
{
  /*/programming/*/
  printf("programming!\n");
}

B.

#include <stdio.h>
main()
{
  /*programming*/
  printf("programming!\n");
}

C.

#include <stdio.h>
main()
{
  /*/*programming*/*/
  printf("programming!\n");
}

D.

include <stdio.h>
main()
{
  /*programming*/
  printf("programming!\n");
}

【答案】B

【解析】A项中,“main()”函数后面不能加分号;C语言中注释语句的注释方法是:/*注释内容*/或//注释一行,且“/*”和“*/”不能嵌套使用,C项错误;D选项中预编译命令“include <stdio.h>”前缺少“#”号。答案选择B选项。

17有以下程序

#include <stdio.h>
main()
{
  int a=0,b=0;
  /*给a赋值a=10;
  b=20;给b赋值*/
  printf("a+b=%d\n",a+b);/*输出计算结果*/
}

程序运行后的输出结果是(  )。

A.a+b=0

B.a+b=30

C.a+b=10

D.出错

【答案】A

【解析】注释/*和*/之间的代码不参与编译,所以a、b的值仍为0。答案选择A选项。

18关于C语言的变量名,以下叙述正确的是(  )。

A.变量名不可以与关键字同名

B.变量名不可以与预定义标识符同名

C.变量名必须以字母开头

D.变量名是没有长度限制的

【答案】A

【解析】合法的标识符由字母(大、小写均可)、数字和下划线组成,并且必须以字母或下划线开头。关键字是指被C语言保留的,不能用作其他用途的标识符,它们在程序中都代表着固定的含义,用户不可重新定义,A项正确、BC两项错误。变量名没有长度限制,但不可超过编译器可以辨识的范围,D项错误。答案选择A选项。

19以下选项中叙述正确的是(  )。

A.C语言的标识符可分为关键字、预定义标识符和用户标识符三类

B.C语言的标识符可分为语句、变量和关键字三类

C.C语言的标识符可分为函数名、变量和预定义标识符三类

D.C语言的标识符可分为运算符、用户标识符和关键字三类

【答案】A

【解析】C语言的标识符可分为关键字、预定义标识符和用户标识符三类,答案选择A选项。

20C语言中的标识符分为关键字、预定义标识符和用户标识符,以下叙述中正确的是(  )。

A.预定义标识符(如库函数中的函数名)可用作用户标识符,但失去原有含义

B.用户标识符可以由字母和数字任意顺序组成

C.在标识符中大写字母和小写字母被认为是相同的字符

D.关键字可用作用户标识符,但失去原有含义

【答案】A

【解析】C语言允许把预定义标识符重新定义另作他用,但这将失去预先定义的原意。B项,标识符的第一个字符必须为字母或下划线;C项,标识符区分大小写;D项,关键字是指被C语言保留的,不能用作其他用途的标识符。答案选择A选项。

21关于C语言标识符,以下叙述错误的是(  )。

A.标识符可全部由数字组成

B.标识符可全部由下划线组成

C.标识符可全部由小写字母组成

D.标识符可全部由大写字母组成

【答案】A

【解析】C语言标识符只能由字母、数字、下划线构成,且只能以字母、下划线开头,故答案选择A选项。

22按照C语言规定的用户标识符命名规则,不能出现在标识符中的是(  )。

A.大写字母

B.连接符

C.数字字符

D.下划线

【答案】B

【解析】C语言中标识符只能由下划线、字母和数字组成,且不能以数字开头。答案选择B选项。

23以下C语言用户标示符中,不合法的是(  )。

A._1

B.AaBc

C.a_b

D.a--b

【答案】D

【解析】C语言中的标识符只能由字母、数字和下画线构成,且第一个字符必须是字母或下画线,同时不能与C语言中的关键字相同。D项还有非法字符“-”。答案选择D选项。

24以下选项中,能用作用户标识符的(  )。

A.void

B.8_8

C._0_

D.unsigned

【答案】C

【解析】标识符是由若干个字符组成的字符序列,用来命名程序的一些实体。C语言定义标识符应遵循以下六种规则:标识符由字母、数字或下划线组成;第一个字符必须是字母或下划线;标识符最多由274个字符组成;在标识符中严格区分大小写字母;关键字不能作为自定义的标识符在程序中使用。A、D项皆为C语言的关键字,B项第一个字符为数字,错误。答案选择C选项。

25以下选项中可用作c语言中合法用户标识符的是(  )。

A._123

B.void

C.-abc

D.2a

【答案】A

【解析】合法标识符的命名规则是:标识符可以由字母、数字和下划线组成,并且第一个字符必须为字母或下划线,其中,关键字在程序中都代表着固定的含义,不能另作他用。B项中void是关键字,不合法。C项和D项没有以字母或下划线开头,不合法。答案选择A选项。

26以下选项中合法的标识符是(  )。

A.1_1

B.1-1

C._11

D.1_ _

【答案】C

【解析】C语言的标识符命名规则为:只能由字母、数字和下划线3种字符组成;标识符首位必须是字母或下划线;不能与C语言中的关键字或保留字相同。AD两项,标识符首位不能为数字;B项,标识符首位不能为数字且“-”为不合法的字符。答案选择C选项。

27以下选项中不合法的标识符是(  )。

A.print

B.FOR

C.&a

D._00

【答案】C

【解析】标识符是由若干个字符组成的字符序列,用来命名程序的一些实体。语法规则为:标识符由字母、数字或下划线组成;第一个字符必须是字母或下划线;标识符最多由274个字符组成;在标识符中严格区分大小写字母;关键字不能作为自定义的标识符在程序中使用。C中有非法字符&。答案选择C选项。

28下列定义变量的语句中错误的是(  )。

A.double int_;

B.float US$;

C.char For;

D.int _int;

【答案】B

【解析】标识符由字母、数字、下划线组成。$是非法字符,不能出现在标识符中。答案选择B选项。

29以下叙述中错误的是(  )。

A.非零的数值型常量有正值和负值的区分

B.常量是在程序运行过程中值不能被改变的量

C.定义符号常量必须用类型名来设定常量的类型

D.用符号名表示的常量叫符号常量

【答案】C

【解析】在C语言程序中,可以用一个符号名来代表一个常量,称为符号常量,符号常量在定义是不需要类型,其本身就能表达其类型。答案选择C选项。

30以下选项中关于C语言常量的叙述错误的是(  )。

A.所谓常量,是指在程序运行过程中,其值不能被改变的量

B.常量分为整型常量、实型常量、字符常量和字符串常量

C.常量可分为数值型和非数值型常量

D.经常被使用的变量可以定义为常量

【答案】D

【解析】常量是指在程序运行过程中其值不能被改变的量。在C语言中,有整型常量、实型常量、字符常量和字符串常量等类型。整型常量和实型常量又称数值型常量,它们有正值和负值的区分。所谓变量是指在程序运行过程中其值可以改变的量。C语言规定,程序中所有变量都必须先定义后使用。变量和常量有明显的区分。D项,常量指在程序运行过程中,其值不能被改变的量,而变量是指在程序运行过程中,其值能被改变的量,因此变量不可以定义成常量。答案选择D选项。

31以下选项中不能用作C程序合法常量的是(  )。

A.1,234

B."\123"

C.123

D."\x7D"

【答案】A

【解析】常量分为数值常量和字符串常量,A项错误。BD两项为字符常量;C项为数值常量。答案选择A选项。

32以下选项中能表示合法常量的是(  )。

A.整数:1,200

B.实数:1.5E2.0

C.字符斜杠:'\'

D.字符串:"\007"

【答案】D

【解析】A项错误,表达错误;B项错误,E后面应为整数,不能是小数;C项错误;字符斜杠的表示方法为'\\',因为第一个\表示是转义字符;D项正确,表示空字符串,第一个字符为"\0",正确。答案选择D选项。

33以下选项中不能作为C语言合法常量的是(  )。

A.'cd'

B.0.1e+6

C."a"

D.'\011'

【答案】A

【解析】常量包括整型常量、实型常量、字符常量和字符串常量等。单引号表示字符常量,但不能包含字符串。表达字符串常量时需用双引号。A项,在C语言中,字符常量是用单引号括起来的一个字符,'cd'包含了2个字符;B项,0.1e+6是实型常量的指数形式,代表0.1×106;C项,"\a"是合法的字符串常量,\a是一个非打印的转义字符表示响铃;D项,'\011'是一个字符常量,\011是一个用3位八进制表示的转移字符。答案选择A选项。

34以下选项中,合法的C语言常量是(  )。

A.1.234

B.'C++'

C."\2.0

D.2Kb

【答案】A

【解析】C语言中的常量:整型常量,用不带小数点的数字表示;实型常量,用带小数点的数字表示;字符型常量,用带有单引号的一个字符表示;字符串常量,用一对双引号括起来的一串字符。1.234为实型常量,A项正确;'C++'不合法,若改成"C++"则为字符串常量,B项错误;"\2.0不合法,不是任何类型常量,C项错误;2Kb不合法,若加上双引号"2Kb"为字符串常量,D项错误。答案选择A选项。

35以下选项中,能用作数据常量的是(  )。

A.115L

B.0118

C.1-5e1.5

D.o115

【答案】A

【解析】C语言中实型常量有两种表示:小数形式和指数形式。在指数形式中,字母e(或E)之前必须要有数字,且e或E后面的指数必须为整数,故C项错误;八进制整数常量以数字0开始,而不是o,故D项错误。在八进制数中的有效数字为0~7,故B项错误;L是长整型数据标识,115L为长整型常数即long int,A项正确。答案选择A选项。

36以下选项中,合法的数值型常量是(  )。

A.3.2

B.'X'

C.099

D.0xEH

【答案】A

【解析】A项正确,3.2是合法的实型常量;B项错误,'X'为字符型常量不是数值型常量;C项错误,以0开头,表示八进制,但八进制的每位由0~7中的一个组成;D项错误,0x和H冲突,都是表示十六进制。答案选择A选项。

37以下选项中,合法的一组C语言数值常量是(  )。

A.12. 0Xa23 4.5e0

B.028 .5e-3 -0xf

C..177 4e1.5 0abc

D.0x8A 10,000 3.e5

【答案】A

【解析】A项,C语言中小数必须要有小数点,但是小数部分可以省略,12.是合法的常量;C语言中十六进制数以0X或0x开头,0Xa23是指十六进制数a23;在C语言中,“e”或“E”后跟一个整数来表示以10为底的幂数,4.5e0表示4.5*100。B项,028表示的是八进制,以0开头,0后面的数字只能在0~7之间。C项,4e1.5,e后面只能跟整数,0abc表示八进制,0后面的数字只能在0~7之间;D项,10,000中不能有逗号。答案选择A选项。

38以下选项中正确的定义语句是(  )。

A.double a;b;

B.double a=b=7;

C.double a=7,b=7;

D.double,a,b;

【答案】C

【解析】同一类型变量的定义时,不同变量之间需要用“,”分隔,选项A错误;定义变量时初始化赋值不能用等号连接,选项B错误;变量类型说明后面不能用逗号,而是用空格分离,选项D错误。答案选择C选项。

39以下定义语句中正确的是(  )。

A.int a=b=0;

B.char A=65+1,b='b';

C.float a=1,*b=&a,*c=&b;

D.double a=0.0;b=1.1;

【答案】B

【解析】A项错误,变量定义的时候不能用连续用等号,等号在定义是初始化的一种;C项错误,b是指针变量,*c=&b表示将一个二级指针赋值给一个一级指针,应该为*c=b或者**c=&b;D项,变量前为分号“;”表示前面的语句定义完毕,变量b的定义没有指明变量类型。答案选择B选项。

40以下关于C语言数据类型使用的叙述中错误的是(  )。

A.若只处理“真”和“假”两种逻辑值,应使用逻辑类型

B.若要保存带有多位小数的数据,可使用双精度类型

C.若要处理如“人员信息”等含有不同类型的相关数据,应自定义结构体类型

D.整数类型表示的自然数是准确无误差的

【答案】A

【解析】A项错误,C语言中没有逻辑类型,在C++中才引入的;B项正确,float类型称为单精度类型,double类型称为双精度类型,一般系统中,为float类型的变量分配4个字节的存储单元,为double类型的变量分配8个字节的存储单元。C项正确,struct结构体,可以用来描述包含多种基本类型的复杂对象。D项正确,整数的表示是不存在误差的。答案选择A选项。

41设有两行定义语句:

int scanf;

float case;

则以下叙述正确的是(  )。

A.两行定义语句都不合法

B.两行定义语句都合法

C.第1行语句不合法

D.第2行语句不合法

【答案】D

【解析】预定义标识符是系统已经有过定义的标识符,用户可以重新定义,可以作为变量名。scanf为库函数名,属于预定义标识符,可以被用户重定义,第一行语句合法。C语言关键字是被保留的,不能用作其他用途的一些标识符,它们在程序中都代表着固定的含义,用户不可重新定义。case是选择结构switch语句中的关键字,不可被用户重定义,第二行语句不合法。答案选择D选项。

42阅读以下程序:

#include <stdio.h>
main()
{
  int case;
  float printF;
  printf("请输入2个数:");
  scanf("%d %f",&case,&printF);
  printf("%d %f\n",case,printF);
}

该程序编译时产生错误,其出错原因是(  )。

A.定义语句出错,case是关键字,不能用作用户自定义标识符

B.定义语句出错,printF不能用作用户自定义标识符

C.定义语句无错,scanf不能作为输入函数使用

D.定义语句无错,printf不能输出case的值

【答案】A

【解析】在C语言中,关键字又称保留字,它是系统预先定义的,具有特定含义的标识符,故不允许用户重新定义。case为C语言中的关键字,因此用户不能再定义标识符为case的变量。答案选择A选项。

43C语言中,最基本的数据类型包括(  )。

A.整型、实型、逻辑型

B.整型、字符型、数组

C.整型、实型、字符型

D.整型、实型、结构体

【答案】C

【解析】C语言中,最基本的数据类型包括整型、实型、字符型,答案选择C选项。

44C语言整数不包括(  )。

A.带小数点的整数

B.正整数

C.负整数

D.无符号整数

【答案】A

【解析】C语言整数包括正整数,负整数,无符号整数,不含带小数点的整数。答案选择A选项。

45C源程序中不能表示的数制是(  )。

A.二进制

B.八进制

C.十进制

D.十六进制

【答案】A

【解析】C语言中整型常量可以用十进制、八进制数、十六进制数来表示。虽然计算机只能识别二进制数,但二进制不能用源程序表示。答案选择A选项。

46有以下程序:

#include<stdio.h>
main()
{
  int x=011;
  printf("%d\n",++x);
}

程序运行后的输出结果是(  )。

A.12

B.11

C.10

D.9

【答案】C

【解析】x=011表示按照八进制赋值,则十进制数为9,所以输出++x的结果为10。答案选择C选项。

47有以下程序,其中k的初值为八进制数

#include<stdio.h>
main()
{
  int k=011;
  printf("%d\n",k++);
}

程序运行后的输出结果是(  )。

A.12

B.11

C.10

D.9

【答案】D

【解析】整型变量k的值“011”是用八进制表示的,即十进制的“9”,而输出格式为%d,即十进制格式,所以输出为“9”,然后k自增1。答案选择D选项。

48有如下程序:

#include<stdio.h>
main()
{
  int x=072;
  printf("%d\n",x+1);
}

程序运行后的输出结果是(  )。

A.59

B.73

C.115

D.72

【答案】A

【解析】整型常量有3种,十进制整常量,没有前缀,输出格式控制符为%d;八进制整常量,以0作为前缀,输出格式控制符为%o;十六进制整常量,以0X或0x作为前缀,输出格式控制符为%x。八进制数072表示成十进制数为58,即x=072=58,以十进制格式输出x+1=59,答案选择A选项。

49有如下程序:

#include<stdio.h>
main()
{
  int x=0x13;
  printf("%d\n",x+1);
}

程序运行后的输出结果是(  )。

A.12

B.14

C.20

D.13

【答案】C

【解析】整型常量中,十进制整常量没有前缀,输出格式控制符为%d;八进制整常量以0作为前缀,输出格式控制符为%o;十六进制整常量以0X或0x作为前缀,输出格式控制符为%x。十六进制数0x13表示成十进制数为19,以十进制格式输出x+1=19+1=20,答案选择C选项。

50有以下程序:

#include<stdio.h>
main()
{
  int x=0x13;
  printf("INT:%d\n",x+1);
}

程序运行后的输出结果是(  )。

A.INT:14

B.INT:13

C.INT:12

D.INT:20

【答案】D

【解析】0x13是十六进制数,%d需要输出十进制数,换算成十进制:16×1+160×3=16+3=19,输出INT=x+1=20,因此答案选择D选项。

51若函数中有定义语句:

int k;

则(  )。

A.系统将自动给k赋初值0

B.这时k中的值无定义

C.系统将自动给k赋初值-1

D.这时k中无任何值

【答案】B

【解析】int k;这条语句是定义一个整型变量k,这是动态定义,编译程序仅为k开辟存储单元,而没有在存储单元中存放任何初值,此时变量中的值时无意义的。若是静态定义,则会自动初始化,其默认值为0。答案选择B选项。

52有以下程序

#include<stdio.h>
main()
{
  int s,t,A=10;
  double B=6;
  s=sizeof(A);
  t=sizeof(B);
  printf("%d,%d\n",s,t);
}

在VC++2010平台上编译运行,程序运行后的输出结果是(  )。

A.2,4

B.4,4

C.4,8

D.10,6

【答案】C

【解析】sizeof的作用就是返回一个对象或者类型所占的内存字节数。在VC++2010中整型占4个字节,双精度实型占8个字节。答案选择C选项。

53关于C语言中数的表示,以下叙述中正确的是(  )。

A.只有整型数在允许范围内能精确无误地表示,实型数会有误差

B.只要在允许范围内整型和实型都能精确表示

C.只有实型数在允许范围内能精确无误地表示,整型数会有误差

D.只有八进制表示的数才不会有误差

【答案】A

【解析】实型数据在内存中存储的二进制位数是有限的,而一个十进制实数转化为二进制实数时,其有效数字位数有可能会超过尾数的存储长度,从而导致有效数字丢失而产生误差。在整型数允许范围之内,二进制可以表示任意一个整数。答案选择A选项。

54下列形式中不合法的常量是(  )。

A.2.E8

B.-.28

C.-028

D.2e-8

【答案】C

【解析】-028表示的是八进制的整型常量,但八进制的数字只能用0~7表示。AD两项为指数形式的实数表示,在e或E的前面必须要有数字,且e或E后面的指数必须为整数;B项,为整数常量。答案选择C选项。

55以下选项中表示一个合法的常量是(说明:符号u表示空格)(  )。

A.9u9u9

B.0Xab

C.123E0.2

D.2.7e

【答案】B

【解析】十六进制数用0x或0X开头。0Xab是指十六进制数,是合法的常量,B项正确。A项多位数字之间不能用空格间隔,A项错误;当用指数形式表示浮点数据时,E的前后都要有数据,并且E的后面数要为整数,C、D错误。答案选择B选项。

56以下选项中可用作C程序合法实数的是(  )。

A..1e0

B.3.0e0.2

C.E9

D.9.12E

【答案】A

【解析】C程序的合法实数有小数和指数两种表示形式。其中,对于用指数形式表示的实数来说,字母e或E之前必须要有数字,且字母e或E后面的指数必须为整数。B项,e后的指数不能为小数形式;C项,E前必须要有数字;D项,E后缺少整数形式的指数。答案选择A选项。

57以下选项中,能用作数据常量的是(  )。

A.o115

B.0118

C.1-5e1.5

D.115L

【答案】D

【解析】C语言中实型常量有两种表示:小数形式和指数形式。在指数形式中,字母e(或E)之前必须要有数字,且e或E后面的指数必须为整数,故C项错误;八进制整数常量以数字0开始,而不是o,故A项错误。在八进制数中的有效数字为0~7,故B项错误;L是长整型数据标识,115L为长整型常数即long int,D项正确。答案选择D选项。

58以下选项中,合法的C语言实数是(  )。

A.3.1e0.4

B..2e0

C.E13

D.7.12E

【答案】B

【解析】实型常量指数形式由十进制数加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。.2e0为指数形式实数,B项正确。3.1e0.4,阶数不是整数,A项错误。E13阶码标志前缺少十进制数,C项错误。7.12E缺少阶码,D项错误。答案选择B选项。

59以下不合法的数值常量是(  )。

A.8.0E0.5

B.1e1

C.011

D.0xabcd

【答案】A

【解析】实型常量指数形式中,字母e(或E)前后必须都要有数字,且e(或E)后面的指数必须为整数。答案选择A选项。

60以下选项中,合法的数值型常量是(  )。

A.3.1415

B."A"

C.092

D.0xDH

【答案】A

【解析】数值型常量包括整型常量和实型常量。整型常量有三种:十进制常量,用0~9表示,不能以0开头;八进制常量,用0~7表示,必须用0开头;十六进制常量,用0~9和A~F(a~f)表示,必须以0x或0X开头。实型常量:用带小数点的数字表示,其值有两种表达形式,分别为十进制小数形式和指数形式。3.1415为实型常量,A项正确。"A"为长度为1的字符串常量,B项错误。092按照格式来说是八进制整型常量,但是八进制不会出现9,C项错误。0xDH按照格式说是十六进制整型常量,但是不应该出现H,D项错误。答案选择A选项。

61在C语言中,以下选项中不能正确表示10×1000之值的是(  )。

A.1.0E4.0

B.1.E4

C.10E3

D.1.0e4

【答案】A

【解析】实型常量用带小数点的数字表示,其值有两种表达形式,分别为十进制小数形式和指数形式。指数形式由十进制数加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成,而A项中阶码4.0是浮点数,所以A项不能正确表示10×1000之值,B、C、D项都表示正确并且值为10000,答案选择A选项。

62若有定义语句:

int a=10;double b=3.14;

则表达式'A'+a+b值的类型是(  )。

A.char

B.int

C.double

D.float

【答案】C

【解析】在多目运算符相关联的运算数中,如果类型不一致,系统将自动进行类型转换,使两边的类型达到一致后,再进行运算,转换的规则是由“低到高”。'A'是字符型,a是整型,b是double型。字符型数据占1个字节,整型占2个字节,doub1e型占8个字节,故三者相加后为double型,答案选择C选项。

63若有定义:

int a=1,b=2,c=3;

则执行表达式(a=b+c)||(++b)后,a、b、c的值依次为(  )。

A.1,2,3

B.5,3,2

C.5,2,3

D.5,3,3

【答案】C

【解析】||表示或运算,当第一个表达式为真时,第二个表达式不执行。根据运算符的优先级规则,先计算(a=b+c),将b+c的值赋值给a,则a=5,而||右边的括号不会被执行,所以b=2,c=3。答案选择C选项。

64C语言程序中,运算对象必须是整型数的运算符是(  )。

A.&&

B./

C.%

D.*

【答案】C

【解析】模运算中不能出现浮点数,运算对象只能是整数。答案选择C选项。

65以下不能用于实型数据的运算符是(  )。

A.%

B./

C.*

D.+

【答案】A

【解析】“%”符号两边必须是整数,答案选择A选项。

66设x,y,z均为实型变量,代数式在C语言中的正确写法是(  )。

A.x/y*z

B.x%y%z

C.x/y/z

D.x*z/y

【答案】C

【解析】%是取余运算符,不符合。运算符*、/的结合顺序是从左到右,所以x先除以y,再除以z。答案选择C选项。

67以下不能正确表示代数式的C语言表达式是(  )。

A.2*a*b/c/d

B.a*b/c/d*2

C.a/c/d*b*2

D.2*a*b/c*d

【答案】D

【解析】*与/优先级相同,采用左结合的方式。D项若改为:2*a*b/(c*d)则为正确。答案选择D选项。

68若在程序中变量均已定义成int类型,且已赋大于1的值,则下列选项中能正确表示代数式1/abc的表达式是(  )。

A.1.0/a/b/c

B.1/(a*b*c)

C.1.0/a*b*c

D.1/a/b/(double)c

【答案】A

【解析】abc均大于1,所以表达式1/abc小于1,需要用浮点类型表示。若要计算表达式值,需要使其自动转化成浮点类型,A项正确。B项变量与常量均为整型,不会自动转换为浮点类型,B项错误。C项表示表达式bc/a,错误。D项,算数运算法结合性自左向右,先计算1/a,结果为0,之后的计算无论是否转换数据类型结果均为0,D项错误。答案选择A选项。

69设变量x为long int型并已正确赋值,以下表达式中能将x的百位上的数字提取出来的是(  )。

A.x/10%100

B.x%10/100

C.x%100/10

D.x/100%10

【答案】D

【解析】x/100结果的个位数上的数字是原来x的百位数上的数字,则要得到这个数字只需要再%10即可。答案选择D选项。

70以下可以将任意一个两位整数n的个位数与十位数对换的表达式为(  )。

A.(n-n/10×10)×10+n/10

B.n-n/10×10+n/10

C.n/10+(n-n/10)

D.(n-n/10)×10+(n/10)

【答案】A

【解析】A项n/10得到十位数字,n-n/10得到个位数字,将个位数乘以10加上十位数字,(n-n/10×10)×10+n/10实现将任意一个两位整数个位数与十位数对换,A项正确。B项n-n/10×10得到个位数字,n/10为十位数字,n-n/10×10+n/10实现两位整数个位数与十位数之和,B项错误。C项n/10+(n-n/10)=n,不能实现题目中要求,C项错误。D项n/10是十位数字,n-n/10为原两位整数减去十位数字,不是个位数字,D项错误。答案选择A选项。

71设有以下程序段:

int y;

y=rand()%30+1;

则变量y的取值范围是(  )。

A.0≤y≤30

B.0<y≤30

C.1<y<30

D.1<y≤30

【答案】B

【解析】rand函数产生随机整数,任何整数对30求余得到的整数范围为0~29,则y的取值范围为1≤y≤30或者0<y≤30,y是整数,0<y≤30。答案选择B选项。

72若有定义语句:int x=12,y=8,z;,在其后执行语句z=0.9+x/y;,则z的值为(  )。

A.1.9

B.1

C.2

D.2.4

【答案】B

【解析】由于x,y,z都是整型数据,所以x除以y的值为整型数值1,之后1和0.9相加得到1.9,再转换为整型数1赋给整型变量z。答案选择B选项。

73表达式:(int)((double)9/2)-9%2的值是(  )。

A.0

B.3

C.4

D.5

【答案】B

【解析】运算符“/”“%”的优先级高于“-”,所以先进行除法和求余运算,再进行减法运算。强制类型转换表达式的形式:(类型名)(表达式)。“9/2”结果为4,转换成double类型再转换成int类型结果依然为4,9%2的结果为1,最后结果为4-1=3。答案选择B选项。

74设有定义:int x=7,y=12;,则以下表达式值为3的是(  )。

A.(y%=x)-(x%=5)

B.y%=(x%=5)

C.y%=x-x%5

D.y%=(x-x%5)

【答案】A

【解析】A项正确,a%=b表示a=a%(b),A项可改写成y=y%x,x=x%5,再计算y-x计算的结果为3,满足题意;B项为0,C项为2,D项等同于C项。答案选择A选项。

75表达式3.6-5/2+1.2+5%2的值是(  )。

A.4.8

B.3.8

C.3.3

D.4.3

【答案】B

【解析】3.6-5/2+1.2+5%2 = 3.6-2+1.2+1=3.8。需要注意的是,两个整数相除仍然得到整数,小数部分被省略,5/2=2。答案选择B选项。

76表达式a+=a-=a=9的值是(  )。

A.9

B.-9

C.18

D.0

【答案】D

【解析】a+=a-=a=9计算顺序为a+=(a-=(a=9)),首先a=9,a-=9,即a=a-9=9-9=0;最后a+=0,即a=a+0=0+0=0。答案选择D选项。

77以下能正确表述算式sin(2πr+30°)的C语言表达式是(  )。

A.sin(2*3.14*r+3.14*30/180.0)

B.sin(2*π*r+30)

C.sin(2*3.14*r+30)

D.sin(2*3.14*r+30*3.14/360.0)

【答案】A

【解析】A项正确。sin是库函数,其参数中的角度要求用弧度制表示。C语言中π不是已定义的常量,需要用户自定义或者直接使用3.14代替π。B项未替换π也没有将30度换算成弧度,错误。C项没有将30度换算成弧度,错误。D项弧度换算错误,π对应于180°,应该除以180.0而不是360.0。答案选择A选项。

78有以下定义

int a;

long b;

double x,y;

则以下选项中正确的表达式是(  )。

A.a%(int)(x-y)

B.a==x!=y

C.(a*y)%b

D.y=x+y=a

【答案】A

【解析】%运算是取两整数相除后余数的运算符,它只适用于整数的运算。A项正确,x-y结果为double型,但是通过强制类型转换将其转换为int型;B项错误,a==x!=y中==和!=是同一个优先级的,先运行a==x,而因为double是占8位的,不能自动转换,必须要强制类型转换,a==(double)x!=y才是正确的;C项错误,(a*y)%b中的(a*y)为double型;D项错误,x+y不能作为左值。答案选择A选项。

79设有定义:

int x=2;

以下表达式中,值不为6的是(  )。

A.x*=x+1

B.x++,2*x

C.x*=(1+x)

D.2*x,x+=2

【答案】D

【解析】A项,因为赋值运算优先级最低,故先执行x+1,赋值符号右侧为3,然后再计算x*=3,所以x=2*3=6;B项,x++得3然后2*x得6;C项与A项原理一致。D项,2*x虽然结果为4,但没有赋值,此时x的值仍为2,所以最终为4。答案选择D选项。

80若变量x、y已正确定义并赋值,以下符合C语言语法的表达式是(  )。

A.x+1=y

B.++x,y=x--

C.x=x+10=x+y

D.double(x)/10

【答案】B

【解析】B项正确,++x是前缀表达式,y=x--是复合语句,先进行x--,然后把自减后的值赋给y。A项错误,x+1是右值,不能被赋值;C项错误,x+10是右值,不能被赋值;D项错误,应改成(double)x/10,double (x)/10是表示声明了一个double变量,它名字是(x)/10,显然不符合C语言语法。答案选择B选项。

81已知大写字母A的ASCII码是65,小写字母a的ASCII码是97。以下不能将变量c中的大写字母转换为对应小写字母的语句是(  )。

A.c=('A'+c)%26-'a'

B.c=c+32

C.c=c-'A'+'a'

D.c=(c-'A')%26+'a'

【答案】A

【解析】A项,模26运算后得到0~25之间的数,再与'a'相减结果是负数;B项,ASCII码表中,同一字母的小写码比大写码数值上大32;C项,'a'-'A'=32;D项,c-'A'取值在0~26,等价于C项。答案选择A选项。

82以下选项中,当x为大于1的奇数时,值为0的表达式是(  )。

A.x%2==1

B.x/2

C.x%2!=0

D.x%2==0

【答案】D

【解析】当x为大于1的奇数,x%2==1,则表达式x%2==0为假(即值为0),答案选择D选项。

83以下选项中,值为1的表达式是(  )。

A.'1'-0

B.1-'0'

C.1-'\0'

D.'\0'-'0'

【答案】C

【解析】ASCII码表,'0'~48,'1'~49,'\0'~0,答案选择C选项。

84有以下程序:

#include<stdio.h>
main()
{
  int a;
  a=(int)1.99*3;
  printf("%d\n",a);
}

程序的运行结果是(  )。

A.3

B.5

C.6

D.结果不确定

【答案】A

【解析】()的优先级大于*,故先将1.99强制转化为1,执行语句a=(int)1.99*3;计算得a=1×3=3。答案选择A选项。

85有以下程序:

#include <stdio.h>
main()
{
  int A=0,B=0,C=0;
  C=(A-=A-5);
  (A=B,B+=4);
  printf("%d,%d,%d\n",A,B,C);
}

程序运行后输出的结果是(  )。

A.0,4,5

B.4,4,5

C.4,4,4

D.0,0,0

【答案】A

【解析】C语言中可以将多条语句放在同一行,用“;”隔开。赋值运算和逗号运算都是从左到右结合。首先执行A-=A-5,即A=A-(A-5),得A的值为5,然后执行C=(A-=A-5),即将A的值5赋给变量C,使得C的值也为5。然后执行下句逗号表达式中的A=B,把B的值0赋给A,此时A的值为0,然后执行B=B+4,使得B的值为4,最后打印输出。答案选择A选项。

86有以下程序

#include<stdio.h>
main()
{
  int a,b,k,m,*p1,*p2;
  k=1,m=8;
  p1=&k,p2=&m;
  a=/*p1-m;
  b=*p1+*p2+6;
  printf("%d",a);
  printf("%d\n",b);
}

编译时编译器提示错误信息,你认为出错的语句是(  )。

A.a=/*p1-m

B.b=*p1+*p2+6;

C.k=1,m=8;

D.p1=&k,p2=&m;

【答案】A

【解析】a=/*p1-m;语句不符合语法规范,可写作a/=(*p1-m);,表示a=a/(*p1-m);。答案选择A选项。

87有以下程序:

#include<stdio.h>
int sub(double a,double b)
{
  return(int)(a-b);
}
main()
{
  printf("%d\n",sub(3.8,2.1));
}

程序运行后的输出结果是(  )。

A.2.0

B.1.7

C.2

D.1

【答案】D

【解析】在类型转换过程中,如果较高类型转换成较低类型,直接忽略多余位数。程序执行过程为:调用函数sub(3.8,2.1),3.8-2.1=1.7(double类型),(int)强制转换将1.7转换成int类型1,然后返回1并输出。答案选择D选项。

88有以下程序:

#include<stdio.h>
int sub(double a,double b)
{
  return(int)(a-b-1.3);
}
main()
{
  printf("%d\n",sub(3.2,4.1));
}

程序运行后的输出结果是(  )。

A.-2

B.1.7

C.-3

D.2.0

【答案】A

【解析】sub函数输出(int)(a-b-1.3)将结果强制转化为整型。(a-b-1.3)=-2.2,(int)(-2.2)=-2,sub(3.2,4.1)=-2,答案选择A选项。

89有以下程序:

#include<stdio.h>
float fun(double a)
{
  double x;
  x=a-(int)a;
  return x;
}
main()
{
  double a=3.1415;
  printf("%f\n",fun(a));
}

程序的运行结果是(  )。

A.3.000000

B.3.141500

C.0.141500

D.0.000000

【答案】C

【解析】在fun函数中,x=a-(int)a表示x取值为a的小数部分,因此,输入a为3.1415,输出x=0.141500。答案选择C选项。

90有以下程序:

#include <stdio.h>
#include <math.h>
main()
{
  int a = 1,b=4,c = 2;
  double x = 10.5,y = 4.0,z;
  z = (a + b)/c + sqrt(y)*1.2/c+x;
  printf("%f\n",z);
}

程序运行后的输出结果是(  )。

A.13.700000

B.14.000000

C.15.400000

D.14.900000

【答案】A

【解析】sqrt为平方根计算函数,a、b、c三个变量都是整型变量,(a+b)/c结果也取整型得2,所以有z=(1+4)/2+2*1.2/2+10.5=13.7。%f格式输出后为13.700000。答案选择A选项。

91若变量已正确定义并赋值,则错误的赋值语句是(  )。

A.a=a+1;

B.a=sizeof(double);

C.a=d||c;

D.a+1=a;

【答案】D

【解析】赋值号的左边必须是一个代表某个存储单元的变量名,赋值号的右边必须是C语言中合法的表达式。赋值运算的功能是先求出右边表达式的值,然后把此值赋给赋值号左边的变量。答案选择D选项。

92设a、b、c是整型变量且均已赋值,则以下选项中错误的赋值语句是(  )。

A.a=(b=3)=1;

B.a=(b=2)+c;

C.a=b=c+10;

D.a=1+(b=c=2);

【答案】A

【解析】赋值运算结合性为由右向左结合,赋值运算符左值为变量,右值为变量或常量或表达式,且左右两边数据类型相同才能实现赋值。A项中,赋值运算(b=3)=1,左值为表达式,不是变量不能被赋值,A项错误。B项运算过程为,先赋值b=2,再计算b+c,将结果赋给a,是正确的赋值语句。C项运算过程为,先计算c+10将结果赋给b,再将b赋给a,是正确的赋值语句。D项运算过程为,先将2赋给c,再将c赋给b,然后计算1+b,将结果赋给a,是正确的赋值语句。答案选择A选项。

93设有定义:

int a=0,b=1,c=1;

以下选项中,表达式值与其他三个不同的是(  )。

A.b=a==c

B.a=b=c

C.a=c==b

D.c=a!=c

【答案】A

【解析】赋值运算结合性为由右向左结合,成功实现赋值后以左值为返回值。逻辑表达式成立则返回1,不成立返回0。A项,逻辑表达式a==c不成立,则b=0,表达式值为0;B项,将c赋值给b,b=1,再将b赋给a,a=1,表达式值为1;C项,逻辑表达式c==b成立,则a=1,表达式值为1;D项,逻辑表达式a!=c成立,则c=1,表达式值为1。A项与其他项不同。答案选择A选项。

94若有定义:

int a,b,c;

以下选项中的赋值语句正确的是(  )。

A.a=(b=c)+1;

B.(a=b)=c=1;

C.a=(b==c)=1;

D.a+b=c;

【答案】A

【解析】赋值运算结合性为由右向左结合,赋值运算符左值为变量,右值为变量或常量,且左右两边数据类型相同才能实现赋值。A项中,将c赋值给b,然后将b加1赋值给a,是正确的赋值语句,正确。B项中,将1赋值给c,赋值运算(a=b)=c中左值为表达式,不是变量不能被赋值,错误。C项中赋值运算(b==c)=1左值为逻辑表达式,不是变量不能被赋值,错误。D项左值a+b为表达式,不是变量不能被赋值,D项错误。答案选择A选项。

95设a、b、c是整型变量,且已正确赋初值,以下选项中错误的赋值语句是(  )。

A.a=1%(b=c=2);

B.a=(b=3)*c;

C.a=b=c/10;

D.a=2=(b=9)=1;

【答案】D

【解析】D项,“()”具有最高优先级,b先赋值9,再根据赋值运算符号自右向左进行赋值,再给b赋值为1,再计算2=b,赋值运算符左边必须是一个变量,但数值2是常量,语法错误。答案选择D选项。

96若已有定义语句:int a,b,c;,且变量已正确赋初值,则以下选项中正确的赋值表达式是(  )。

A.a=(b=c)+8;

B.(a=b)=c=9;

C.a=(b==c)='A';

D.a+b=c+1;

【答案】A

【解析】A项正确,将c赋值给b后又加上8,然后再赋值给a;B、D项错误,赋值运算符左边必须是一个变量;C项错误,(b==c)是个表达式,语法错误。答案选择A选项。

97若想给已定义为int型的变量a、b、c、d赋整数1,以下选项中错误的语句是(  )。

A.a=b,b=c,c=d,d=1;

B.a=b=c=d=1;

C.a=1,b=a,c=b,d=c;

D.d=1,c=d,b=c,a=b;

【答案】A

【解析】由于C语言逗号表达式的的执行顺序是从左向右,赋值运算符是自右向左,A选项先执行a=b时,b为空值,故不正确;所以在连续赋值时一定要保证赋值运算符的右项有确定的值。答案选择A选项。

98若有定义

double a=22;int i=0,k=18;

则不符合C语言规定的赋值语句是(  )。

A.a=a++,i++

B.i=(a+k)<=(i+k)

C.i=a%11

D.i=!a

【答案】C

【解析】C项错误,在C语言的算术运算符中,取余运算符“%”的左右两侧的两个运算分量必须是整数。A项,赋值运算符的优先级高于“,”运算法,先进行赋值;B项,将“=”右边的逻辑表达式的计算结果赋给变量i;D项,首先对变量a求逻辑非操作,然后将结果赋值给变量i。答案选择C选项。

99设变量已正确定义并赋值,以下正确的表达式是(  )。

A.x=y*5=x+z

B.int(15.8%5)

C.x=y+z+5,++y

D.x=25%5.0

【答案】C

【解析】赋值运算左边必须是单一变量名。A项错误,“y*5=x+z”部分是非法赋值。BD两项错误,求余运算中的操作对象只能是整型。C项,为逗号表达式。答案选择C选项。

100若变量均已正确定义并赋值,以下合法的C语言赋值语句是(  )。

A.x=y==5;

B.x=n%2.5;

C.x+n=i;

D.x=5=4+1;

【答案】A

【解析】A项正确,y==5返回0或者1,然后赋值给x。B项错误,浮点数不能参与模运算;C项错误,赋值运算符左边只能是单一变量,x+n是右值,不能给它赋值;D项错误,5是常量,不能被赋值。答案选择A选项。

101以下选项中合法的C语言赋值语句是(  )。

A.++i;

B.a=b=34

C.a=3,b=9

D.k=int(a+b);

【答案】A

【解析】B项和C项缺少分号,不合法。D项类型转换不合法,应为k=(int)(a+b)。答案选择A选项。

102设有定义:

int x=11,y=12,z=0;,

以下表达式值不等于12的是(  )。

A.(z,x,y)

B.(z=x,y)

C.z=(x,y)

D.z=(x==y)

【答案】D

【解析】逗号表达式的计算过程是从左到右逐个求每个表达式的值,取最右边一个表达式的值作为该逗号表达式的值。赋值运算结合性为由右向左结合,赋值运算符左值为变量,右值为变量或常量或表达式,且左右两边数据类型相同才能实现赋值。成功实现赋值后以左值为返回值。逻辑表达式成立则返回1,不成立返回0。D选项逻辑表达式x==y不成立,则z=0,表达式值为0。B选项逗号表达式x,y取y值为表达式值,然后赋值给z=12,表达式值为12。C选项逗号表达式(x,y)取y值为表达式值,然后赋值给z=12,表达式值为12。A选项逗号表达式(z,x,y)取y值为表达式值12。答案选择D选项。

103若有定义语句:

int x=10;

则表达式x-=x+x的值为(  )。

A.-20

B.-10

C.0

D.10

【答案】B

【解析】单目加运算符优先级高于赋值运算符,所以先做x+x结果为20,再做x-20,结果为-10,然后赋值给x。所以答案选择B选项。

104若有定义语句:

int a=12;

则执行语句:a+=a-=a*a;后,a的值是(  )。

A.-264

B.552

C.144

D.264

【答案】A

【解析】赋值运算结合性为自右向左,a+=a-a*a相当于a=a-a*a,a=a+a;自右向左计算过程为a=a-a*a=-132,a=a+a=-264。答案选择A选项。

105有以下定义

int a;

long b;

double x,y;

则以下选项中正确的表达式是(  )。

A.(a*y)%b

B.a==x<>y

C.a%(int)(x-y)

D.y=x+y=a

【答案】C

【解析】%运算是取两整数相除后余数的运算符,它只适用于整数的运算。A项错误,(a*y)%b中的(a*y)为double型;B项错误,C语言中没有<>运算符;C项正确,x-y结果为double型,但是通过强制类型转换将其转换为int型; D项错误,x+y不能作为左值。答案选择C选项。

106有以下程序

#include <stdio.h>
#include <math.h>
main()
{
  int a = 3;
  printf("%d\n",(a+=a-=a*a));
}

程序运行后的输出结果是(  )。

A.-12

B.9

C.0

D.3

【答案】A

【解析】C语言中,表达式从右向左计算。a+=a-=a*a;可以写成a-=a*a; a+=a;,而a-=a*a等价于a = a-(a*a) = 3-(3*3) = -6;a+=a等价于a = a+a =(-6)+(-6) = -12。答案选择A选项。

107设有定义:

int k=0;

以下选项的四个表达式中与其他三个表达式的值不相同的是(  )。

A.++k

B.k+=1

C.k++

D.k+1

【答案】C

【解析】后缀表达式,先赋值,后自增。k++表达式值为k的值0;其余三项为k+1的值,即1。答案选择C选项。

108设变量均已正确定义并且赋值,以下与其他三组输出结构不同的一组语句是(  )。

A.x++;printf("%d\n",x);

B.n=++x;printf("%d\n",n);

C.++x;printf("%d\n",x);

D.n=x++;printf("%d\n",n);

【答案】D

【解析】“++”和“--”运算,当以前缀形式出现时,则先进行加一或减一操作,再取值,当以后缀形式出现时,则先取值,再进行加一或减一操作。++x表示先将x值加1后再用,x++表示先使用x值,用后再加1,所以本题中ABC选项都会输出x+1的值。答案选择D选项。

109有以下程序:

#include<stdio.h>
main()
{
  int x=010,y=10;
  printf("%d,%d\n",++x,y--);
}

程序运行后的输出结果是(  )。

A.10,9

B.11,10

C.010,9

D.9,10

【答案】D

【解析】整型常量有3种表示方法,分别是十进制数表示法、八进制数表示法和十六进制数表示法,八进制整常量以0作为前缀。自增和自减运算符的两种用法:前置运算,运算符放在变量之前,规则是先使变量的值增(或减)1,然后以变化后表达式的值参与其他运算;后置运算,运算符放在变量之后,规则是变量先参与其他运算,然后再使变量的值增(或减)1。x=010,即十进制的8,y=10,++x先自加后取值,输出9,y--先取值输出10,再自减y=9,答案选择D选项。

110有以下程序:

#include<stdio.h>
main()
{
  int i,j,k,a=5,b=6;
  i=(a==b)?++a:--b;
  j=a++;
  k=b;
  printf("%d,%d,%d\n",i,j,k);
}

程序的运行结果是(  )。

A.7,6,5

B.5,5,5

C.7,5,5

D.5,6,5

【答案】B

【解析】条件表达式i=(a==b)?++a:--b;中先执行a==b,值为假,根据三元运算符语法规则,执行--b,此时b为5,赋给i,i=5。j=a++,将a=5先赋给j,再进行a++,j=5,a=6,k=b=5,故最后输出的是5,5,5。答案选择B选项。

111有以下程序:

#include<stdio.h>
main()
{
  int a;
  scanf("%d",&a);
  if(a++<9)printf("%d\n",a);
  else printf("%d\n",a--);
}

程序运行时键盘输入9<回车>,则输出的结果是(  )。

A.10

B.11

C.9

D.8

【答案】A

【解析】“++”和“--”运算,当以前缀形式出现时,则先进行加一或减一操作,再取值,当以后缀形式出现时,则先取值,再进行加一或减一操作。判断条件中if(a++<9)是先用后加,即a的值为9,所以条件不成立,但是a已经进行了自增1操作,a的值此时为10。执行else语句时,因为打印a--,是先用后减,所以先输出10,然后a的值变为9。答案选择A选项。

112有以下程序:

#include <stdio.h>
main()
{
  int a=1,b=0;
  if(--a) b++;
  else if(a==0) b+=2;
  else b+=3;
  printf("%d\n",b);
}

程序运行后的输出结果是(  )。

A.0

B.1

C.2

D.3

【答案】C

【解析】“++”和“--”运算,当以前缀形式出现时,则先进行加一或减一操作,再进行其他运算,当以后缀形式出现时,则先进行其他运算,再进行加一或减一操作。a初始定义为1,b为0,执行--a,a的值变为0,--a的值也为0,即if判断为假,执行b+=2,输出b的值为2。答案选择C选项。

113有以下程序:

#include <stdio.h>
main()
{
  int a=7;
  while(a--);
  printf("%d\n", a);
}

程序运行后的输出结果是(  )。

A.-1

B.0

C.1

D.7

【答案】A

【解析】“++”和“--”运算,当以前缀形式出现时,则先进行加一或减一操作,再取值,当以后缀形式出现时,则先取值,再进行加一或减一操作。程序中执行a--,直到while判断为0时才跳出循环,执行下条语句,即a为0时再执行a--,此时跳出while循环,最终输出的结果为-1。答案选择A选项。

114有以下程序:

#include <stdio.h>
main()
{
  int a=1,b=1;
  while(a--)
    b--;
  printf("%d,%d\n", a,b);
}

程序的运行结果是(  )。

A.-1,0

B.0,0

C.-1,-1

D.1,1

【答案】A

【解析】while循环的判定条件为“a--”,即a先作为循环条件判定,然后再自减1。第一次循环判定条件为真,执行完毕后a=0,b=0,第二次循环判定条件为假,循环不成立,所以只执行判定表达式"a--",所以最终a=-1,b=0,答案选择A选项。

115有以下程序

#include <stdio.h>
main()
{
  int x,y,z;
  x=y=1;
  z=x++,y++,++y;
  printf("%d,%d,%d\n",x,y,z);
}

程序运行后的输出结果是(  )。

A.2,3,1

B.2,3,2

C.2,3,3

D.2,2,1

【答案】A

【解析】注意区分,z=x++是先将x的值赋给z,在令x自增;z=++x是先将x自增,再将自增后的值赋给z;而无论是++x还是x++,都会完成x自增的运算。对于表达式“z=x++,y++,++y;”,因为赋值运算符的优先级高于逗号运算符的优先级,所以可以将上式改成“(z=x++),(y++),(++y)”。然后从左向右先计算表达式z=x++,后缀自增运算先进行其他运算,再执行自增运算,所以z的值为1,x的值为2,再计算逗号表达式第二个表达式y++,此时y的值为1,y++的值为2,最后计算第三个表达式++y,y的值为3。答案选择A选项。

116以下程序段中的变量已定义为int类型,则

sum=pAd=5;

pAd=sum++,++pAd,pAd++;

printf("%d\n",pAd);

程序段的输出结果是(  )。

A.6

B.4

C.5

D.7

【答案】D

【解析】自增和自减运算符的两种用法:前置运算,运算符放在变量之前,规则是先使变量的值增(或减)1,然后以变化后表达式的值参与其他运算;后置运算,运算符放在变量之后,规则是变量先参与其他运算,然后再使变量的值增(或减)1。执行pAd=sum++,sum++是后置自增,执行完后,pAd=5,sum=6;++pAd和pAd++语句中没有其他运算,即效果相同,pAd分别加1,两句执行完后,pAd = 7。答案选择D选项。

117有以下程序

#include<stdio.h>
main()
{
  int sum,pad,pAd;
  sum=pad=5;
  pAd=++sum,pAd++,++pad;
  printf("%d\n",pad);
}

程序的输出结果是(  )。

A.8

B.5

C.7

D.6

【答案】D

【解析】C语言中的标识符区分大小写,pad只实现了一次自增操作,结果输出6。答案选择D选项。

118有以下程序

#include <stdio.h>
main()
{
  int i;
  for(i=1;i<=40;i++)
  {
    if(i++%5==0)
      if(++i%8==0)printf("%d",i);
  }
  printf("\n");
}

执行后的输出结果是(  )。

A.32

B.24

C.5

D.40

【答案】A

【解析】自增运算符“++”分为前缀和后缀两种形式。两种形式的作用效果是一样的,都是使运算分量的值加1,但是它们的表达式的值不一样,前缀形式表达式的值为运算分量加1之后的值,而后缀形式表达式的值为运算分量加1之前的值。题目中使用了一个for循环,循环变量i从1递增到40。在循环体中有两条嵌套的if语句,首先判断i++%5==0,即判断i++的值(i加1之前的值)是否能被5整除(判断后i被加1),然后再判断++i的值(i加1之后的值)是否能被8整除(判断后i被加1),若两个条件都满足了,就输出i的值,只有i=30时,满足i++%5==0,此时i=31,++i%8==0成立,此时i=32。答案选择A选项。

119有如下程序:

#include<stdio.h>
main()
{
  int a =0,b=1;
  if(++a==b++)
    printf("T");
  else
    printf("F");
  printf("a=%d,b=%d\n",a,b);
  printf("\n");
}

程序运行后的输出结果是(  )。

A.Ta=0,b=1

B.Fa=1,b=2

C.Ta=1,b=2

D.Fa=0,b=2

【答案】C

【解析】程序执行过程为:判断++a==b++是否成立,++a前置运算先加1,则运算符==左边表达式值为1,a=1,b++后置运算先取值,则==右边表达式值我1,b=2,即是判断1==1,成立,输出T,输出a=1,b=2。答案选择C选项。

120有如下程序:

#include<stdio.h>
main()
{
  int a =0,b=1;
  if(a++&&b++)
    printf("T");
  else
    printf("F");
  printf("a=%d,b=%d\n",a,b);
}

程序运行后的输出结果是(  )。

A.Ta=1,b=2

B.Fa=0,b=2

C.Fa=1,b=1

D.Ta=0,b=1

【答案】C

【解析】程序中判断if条件是否成立,a++先取值为0,则(a++&&b++)为0,不且不计算b++,而后a自增得a=1,if条件不成立,执行else下的语句,输出F。最后执行输出语句;按照格式输出a=1,b=1。答案选择C选项。