C语言习题三
一、单项选择题
相关知识点
1、标识符
2、字符常量
在C语言中,字符常量就是指单引号里的单个字符,还有一种特殊情况,比如“\n”,“\a”,像这样的字符常量就是通常所说的转义字符。这种字符是以反斜杠(\)开头,后面跟一个字符或者一个八进制或十六进制数,表示的不是单引号里面的值,而是“转义”,即转化为具体的含义
3、字符串常量
用双引号括起来的形式显示,其值就是双引号里面的字符串。所以字符串常量可以定义为在一对双引号里的字符序列或转义字符序列,比如""、" "、"a"、"abc"、"abc\n"等。
1、以下选项中可用作C语言合法用户标识符的是( D)
A.2a | B.void | C.-abc | D._123 |
2、以下哪个是合法的C语言浮点型变量定义?(C )
A.float 1num = 3.14; | B.double num = 3,14; |
C.float num3 = 3.14f; | D.real num4 = 3.14; |
3、下列哪个选项是C语言中的逻辑运算符?(D )
A.&& | B.|| | C.! | D.以上都是 |
4、以下选项中,合法的C语言常量是( C)
A."\2.0" | B.'C++' | C.1.234 | D.2Kb |
5、以下叙述中错误的是(A )
A.书写风格良好的程序执行效率高 |
B.书写风格良好的程序易读性好 |
C.C程序可以在一行上写多条语句 |
D.C程序允许将一条语句分写在多行上 |
6、表达式5&3的结果是(A )
A.1 | B.2 | C.3 | D.5 |
7、C语言程序从( C)开始执行。
A.程序中第一条可执行语句 | B.程序中第一个函数 |
C.程序中的main函数 | D.包含文件中的第一个函数 |
8、在C语言程序中,表达式5%2的结果是(C )
A.2.5 | B.2 | C.1 | D.3 |
9、下列属于整型常量的是( A)
A.12 | B.-12.0 | C.12.0 | D.10E10 |
10、以下说法中正确的是( C)
A.C语言程序总是从第一个定义的函数开始执行 |
B.在C语言程序中,要调用的函数必须在main()函数中定义 |
C.C语言程序总是从main()函数开始执行 |
D.C语言程序中的main()函数必须放在程序的开始部分 |
11、C语言中,关系表达式和逻辑表达式的值是(B )
A.0 | B.0或1 | C.1 | D.‘T’或‘F’ |
12、不属于字符型常量的是(C )
A.‘A’ | B.‘a’ | C.“A” | D.‘b’ |
13、表达式2 + 3 * 4的计算结果是(B )
A.20 | B.14 | C.24 | D.10 |
14、C语言用( C)表示逻辑“真”值
A.True | B.t或Y |
C.非零值 | D.整型值0 |
15、根据C语言的语法规则,下列(A )是不合法标识符。
A.while | B.Name | C.Rer5 | D._exam |
16、在每个C语言程序中,都必须包含(A )函数。
A.main() | B.MAIN() | C.function() | D.name() |
17、转义字符\n表示( A)
A.换行符 | B.退格 |
C.翻页 | D.水平跳格 |
18、C语言中,要求运算量必须是整型的运算符是( C)
A.* | B./ | C.% | D.- |
19、下列符号中用来表示C语言中的回车换行的是( D)
A.\r | B.\t | C.\b | D.\n |
20、%c表示(C )格式。
A.整数 | B.小数 |
C.字符 | D.指数 |
21、以下代码的输出是(A )
for (int i = 0; i < 3; i++) {
printf("%d", i);
}
A.012 | B.123 |
C.0123 | D.无限循环 |
22、字符串的结束标志是(C )
A.‘0’ | B.EOF |
C.‘\0’ | D.空格 |
23、C语言中的简单数据类型包括(D )
A.整型、实型、逻辑型 |
B.整型、实型、逻辑型、字符型 |
C.整型、字符型、逻辑型 |
D.整型、实型、字符型 |
24、执行以下代码后,x的值为(B )
int x = 10;
if (x > 5) {
x = 20;
}
else if (x > 8) {
x = 30;
}
A.10 |
B.20 |
C.30 |
D.编译错误 |
25、以下说法正确的是(C )
A.break语句只能用于switch语句 |
B.continue语句的作用是使程序的执行流程跳出包含它的所有循环 |
C.break语句只能用在循环体内和switch语句体内 |
D.在循环体内使用break语句和continue语句的作用相同 |
26、下列的人物当中,谁被称为C语言之父( B)
A.马丁·理察斯 | B.丹尼斯·里奇 |
C.肯·汤普逊 | D.比雅尼·斯特劳斯特鲁普 |
27、C语言源程序中主函数名是( C)
A.master | B.leading | C.main | D.major |
28、下列不能定义为用户标识符的是( D)
A.bb31 | B.Aa | C.W12 | D.int+float |
29、一个C语言程序是由( B)
A.一个主程序和若干子程序组成 | B.一个或多个函数组成 |
C.若干过程组成 | D.若干子程序组成 |
30、C语言程序的基本单位是( C)
A.程序行 | B.语句 | C.函数 | D.字符 |
31、下列选项中不属于C语言关键字的是( D)
A.while | B.auto |
C.break | D.printf |
32、下列选项中不属于C语言算术运算符的是( C)
A.+ | B.% | C.= | D.- |
33、以下C语言运算符中,运算对象必须为整型的是( D)
A./ | B.= | C.>= | D.%= |
34、C语言程序的3种基本程序是( A)
A.顺序结构,选择结构,循环结构
B.递归结构,循环结构,转移结构
C.嵌套结构,递归结构,顺序结构
D.循环结构,转移结构,顺序结构
35、下列可以保证至少执行一次循环体的循环结构是( C)
A.for循环 | B.while循环 |
C.do-while循环 | D.if语句 |
36、在C语言的switch语句中,case后面是( B)
A.只能为常量
B.只能为常量或常量表达式
C.可为常量及表达式或有确定值的变量及表达式
D. 可为任何量或表达式
37、C语言中,哪个关键字用于定义一个函数( D)
A.int | B.return | C.function | D.void |
38、下列选项中属于C语言逻辑运算符的是( D)
A.&& | B.|| |
C.! | D.以上都是 |
39、下列叙述中,正确的是( C)
A.break语句只能用于switch语句
B.continue语句的作用是使程序的执行流程跳出包含它的所有循环
C.break语句只能用在循环体内和switch语句体内
D.在循环体内使用break语句和continue语句的作用相同
40、下列for循环语句正确的是( D)
A.for (i = 1; i < 10; i++) | B.for (i = 1; i <= 10; i++) |
C.for (i = 10; i >= 1; i--) | D.以上都是正确的 |
二、程序分析题(附部分解析)
相关知识点
C语言所有运算符的优先级
++ --优先级高于||
++在前,先加后标,++在后,先标后加,标的是表达式,加的是变量本身
--在前,先加后标,--在后,先标后加,标的是表达式,减的是变量本身
在C语言中,0为假,非0为真,逻辑表达式的结果通常是0或1,C语言的关系运算表达式的结果只有1或0。
&&:有假为假,全真为真
||:全假为假,有真为真
&&:逻辑与:当左侧为真时,才会计算右侧表达式;如果左侧为假,结果直接为假,右侧表达式不会被计算
||:逻辑或:当左侧为假时,才会计算右侧表达式;如果左侧为真,结果直接为真,右侧表达式不会被计算
1、下列程序的运行结果为 k=2
#include<stdio.h> int main() {int a = 5, b = 10,k;k = (++a || b--);k++;printf("k=%d", k--);return 0; }
解析:
①执行++a后,a的值加1为6,++a表达式的值为6,||左侧为真,b--不会被计算,(++a || b--)逻辑表达式的值为1(为真)。②接下来k++,k++表达式的值为1,k本身自增1,为2。③k--表达式的值为2,k本身自减1,为1。④题目要输出的是k--这个表达式的值,答案即为k=2。
2、下列程序的运行结果为 -76
#include<stdio.h> int main() {char a = 2;int b = -78;printf("%d", a + b);return 0; }
在 C 语言中,当不同类型的数据进行运算时,会发生隐式类型转换,遵循整数提升规则:char类型会隐式转换成int类型,char a=2在运算时会被提升为int类型,值仍为2,a+b等价于2+(-78)
3、下列程序的运行结果为 15
#include<stdio.h> int main() {int a = 12;float b = 3.54159;printf("%d", a + (int)b);return 0; }
在C语言中,将float类型转换成int类型时,会进行截断操作,即去掉小数部分,只保留整数,这里3.54159截断后为3,结果为12+3=15
4、下列程序的运行结果为 result=-6
#include<stdio.h> int main() {int x = 2, y = 3, z = 4;int result;result = x -= y *= x += z && 1;printf("result=%d", result);return 0; }
&&优先级高于-=、*=、+=;&&有0为0,全1为1。①先计算Z&&1,z为4,4&&1为1;②x+=1即x=x+1,x=3;③y*=3即y=y*3,y为9;④x-=9即x=x-9,为-6
5、下列程序的运行结果为 b=3 a=-3
#include<stdio.h> int main() {int a = 1, b = 2;a *= b -= a *= (a - b);printf("b=%d a=%d", b, a);return 0; }
①先计算(a-b),为-1;②a*=-1即a=a*(-1),a=-1;③b-=-1即b=b-(-1),b为3;④a*=3即a=a*3,a为-3
6、下列程序的运行结果为 result=1
#include<stdio.h> int main() {int a = 79, b = 26, c = 2;printf("result=%d", (a - c * 4) != 26);return 0; }
先计算c*4为8,再计算a-8,为71,71不等于26成立,为真,答案为1
7、下列程序的运行结果为 13
#include<stdio.h> int main() {int a = 1;if (a-- != 1)printf("789");elseprintf("13");return 0; }
--在后,先标后减,a--表达式的值为1,a自身减1,为0。a--表达式的值为1,等于1,条件不成立,输出13
8、下列程序的运行结果为 goodluck
#include<stdio.h> int main() {int n = 'b';switch (++n) {default:printf("error"); break;case 'a':case 'A':case 'b':case 'B':printf("pass"); break;case 'c':case 'C':printf("good");case 'd':case 'D':printf("luck");}return 0; }
由于在嵌套的switch语句之后没有break语句,程序会继续执行后续的代码块,直到遇到一个break语句或达到switch语句的常量,所以这里输出了good后还会输出luck
9、下列程序的运行结果为 -1
#include<stdio.h> int main() {int c;c = 1;switch (c) {case 2:c++;default:c--;c--;}printf("%d", c);return 0; }
变量c的值为1,case后面没有与之匹配的1,进入default分支,在default分支里面先执行c--,c自减1,为0。因为没有break,继续执行,执行c--,c自减1,为-1
10、下列程序的运行结果为 10 7
#include<stdio.h> int main() {int i = 2, a = 4;for(;i<10;i++)for (; a < 7; a++) {if (i + a > 11)break;elsei++;}printf("%d %d", i, a); }
①初始值i=2,a=4,先进入外层循环,i<10成立,进入内循环,a<7成立,进入if判断,此时i+a为2+4=6,6>11不成立,进入else分支,i++,i自增1,i为3,a++,a为5,5<7成立,进入if判断,i+a=3+5=8>11不成立,进入else分支,i++,i自增1,i为4,a++,a为6,6<7成立,进入if判断,i+a=4+6=10>11不成立,进入else分支,i++,i自增1,i为5,a++,a为7,7<7不成立,进入外循环②i++,i自增1,i为6,6<10成立,进入内循环,此时a=7,a<7不成立,进入外循环③i++,i自增1,i为7,7<10成立,进入内循环,此时a=7,a<7不成立,进入外循环④i++,i自增1,i为8,8<10成立,进入内循环,此时a=7,a<7不成立,进入外循环⑤
i++,i自增1,i为9,9<10成立,进入内循环,此时a=7,a<7不成立,进入外循环⑥i++,i自增1,i为10,10<10不成立,输出i为10,a为7。
11、下列程序的运行结果为 25
#include<stdio.h> int main() {int i, j;int c = 0;for (i = 1; i <= 5; i++) {for (j = 1; j <= 5; j++)c++;}printf("c=%d", c); }
12、下列程序的运行结果为 200
#include<stdio.h> int main() {int a = 100, b = 200, c = 300;while (b < c)if (a < b)c -= 50;printf("%d", c);return 0; }
b=200,c=300,b < c成立,a=100,b=200,a < b成立,执行c -= 50,即c=c-50,c为250。此时c=250,b=200,b < c成立,进入if,a=100,b=200,a < b成立,执行c -= 50,即c=c-50,c为200。此时b=200,c=200,b < c不成立,输出200
13、下列程序的运行结果为 12 16
#include<stdio.h> int main() {int a = 2, b = -9;for (; a <= 10; a++, b--) {b += a;a++;}printf("%d %d", a, b);return 0; }
①初始值a=2,b=-9,a<=10成立,b+=a,即b=b+a,b为-7,a++,a为3;②a++,a为4,b--,b为-8,a<=10成立,b+=a,即b=b+a,b为-4,a++,a为5;③a++,a为6,b--,b为-5,a<=10成立,b+=a,即b=b+a,b为1,a++,a为7;④a++,a为8,b--,b为0,a<=10成立,b+=a,即b=b+a,b为8,a++,a为9;⑤a++,a为10,b--,b为7,a<=10成立,b+=a,即b=b+a,b为17,a++,a为11;⑥a++,a为12,b--,b为16,a<=10不成立,输出a为12,b为16。
14、下列程序的运行结果为 123
#include<stdio.h> int main() {int a = 123 + 5 / (-9);printf("%d", a);getchar();return 0; }
5 / (-9)为0,a=123+0
15、下列程序的运行结果为 -103 17
#include<stdio.h> int main() {int a = -123, b = 20;printf("%d ", a + b % a);printf("%d", b + a % b);getchar();return 0; }
b % a,即20%(-123)为20,a+20为-103
a % b,即-123%20为-3,b+(-3)为17
16、下列程序的运行结果为 5
#include<stdio.h> int main() {int i = 5, j;j = i++;printf("%d", j);getchar();return 0; }
17、下列程序的运行结果为 6
#include<stdio.h> int main() {int i = 5, j;j = ++i;printf("%d", j);getchar();return 0; }
18、下列程序的运行结果为 1
#include<stdio.h> int main() {int a = 10, b = 8;printf("%d", a != b);getchar();return 0; }
C语言的关系运算表达式的结果只有1或0。10不等于8成立。
19、下列程序的运行结果为 0
#include<stdio.h> int main() {int a = 100, b = 435, c = -77;printf("%d", a > b&&b > c&&c > a);getchar();return 0; }
关系运算符的优先级高于逻辑运算符,先判断a>b,b>c,c>a是否成立,即0&&1&&0。&&:有0为0,全1为1
20、下列程序的运行结果为 1
#include<stdio.h> int main() {int a = 65;char b = 'A';printf("%d", a == b);getchar();return 0; }
在 C 语言中,当不同类型的数据进行运算时,会发生隐式类型转换,遵循整数提升规则:char类型会隐式转换成int类型,char b = 'A'在运算时会被提升为int类型,A的ASCII码为65,a==b成立,==是等于号,条件表达式的值只有0,1两种,0为假,1为真
21、下列程序的运行结果为 9
#include<stdio.h> int main() {int a = 1, b = 2, c = 3, d = 55;d = a++ && b++ || c-- && 0;printf("%d", a + b + c + d);getchar();return 0; }
&&运算符优先级高于||运算符,对于a++,++在后先标表达式后加变量本身,a++表达式的值为1,a为2,即d=1,b++表达式的值为2,b为3,1&&2的值为1。对于逻辑运算符||:如果左侧为真,结果直接为真,右侧表达式不会被计算,即c还是为3,a+b+c+d=2+3+3+1=9
22、下列程序的运行结果为 2
#include<stdio.h> int main() {int a, b, c, d;a = 1; b = 2, c = 3;d = (a, b);printf("%d", d);getchar();return 0; }
23、下列程序的运行结果为 633
#include<stdio.h> int main() {int a = 1, b = 2, c = 3;a = b = c, a = b + c;printf("%d%d%d", a, b, c);getchar();return 0; }
24、下列程序的运行结果为 28 133
#include<stdio.h> int main() {int a, b;a = 40;b = 90;printf("%x ", a);printf("%o", b + 1);getchar();return 0; }
%x:十六进制格式,将整数以十六进制形式输出或读取
%o:八进制格式,将整数以八进制形式输出或读取
40(十进制) =28(十六进制) 90 (十进制)=132(八进制)
25、下列程序的运行结果为 1-42 100
#include<stdio.h> int main() {int a = 1, b = -42, c = 100;printf("%5d", a);printf("%-4d", b);printf("%d", c);getchar();return 0; }
%5d:指定输出宽度为 5,右对齐
含义:强制将整数输出为 5 个字符宽度,如果整数的实际位数不足 5 位,在左侧用空格补全;如果超过 5 位,则按实际位数输出(不截断)。%-4d:指定输出宽度为 4,左对齐
含义:强制将整数输出为 4 个字符宽度,如果整数的实际位数不足 4 位,在右侧用空格补全;如果超过 4 位,则按实际位数输出(不截断)。
“-” 符号:表示左对齐(默认是右对齐)。
26、下列程序的运行结果为 -1
#include<stdio.h> int main() {int a = 5, b = 0;if(a)if (a++ > 5) {b++;}else {b--;}printf("%d", b);getchar();return 0; }
第一个if里面表达式成立,进入第二个if,++在后先标后加,a++表达式的值为5,a++>5不成立,进入else,b--,--在后先标后减,b的值为-1
27、下列程序的运行结果为 123 325
#include<stdio.h> int main() {int a = 123, b = 324;if (a < b) {if (a)b++;elsea += b;printf("%d %d", a, b);}getchar();return 0; }
a<b成立,进入第二个if,第二个if表达式括号条件成立,执行b++分支,b自增1,输出a为123,b为325
28、下列程序的运行结果为 46
#include<stdio.h> int main() {int x = 2, y = 7, z = 5;switch (x > 2) {case 1:switch (y > 0) {case 1:printf("1"); break;case 2:printf("2"); break;}case 0:switch (z == 5) {case 0:printf("3"); break;case 1:printf("4"); break;default:printf("5"); break;}default:printf("6");}getchar();return 0; }
进入第一个switch,x>2不成立,为假,即0,进入第一个switch的case 0分支。进入第二个switch,z==5成立,为真,即1,进入第二个switch的case 1分支,输出4,break跳出第二个switch,因为第一个switch的case 0分支没有break,接着进入第一个分支的default分支,输出6,即最后输出46
29、下列程序的运行结果为 3
#include<stdio.h> int main() {int a = 17, b = 21, m = 0;switch (a % 3) {case 0:m++; break;case 2:m++;switch (b % 2) {default:m++; break;}case 1:m++;}printf("%d", m);getchar();return 0; }
a%3得2,进入switch的case 2分支,m++,m自增1,此时m为1。没有break,进入第二个switch,b%2得1,第二个switch没有与之匹配的case 1,则进入default,m++,m自增1,此时m为2,执行break跳出第二个switch,因为第一个switch的case 2分支后面没有break,继续进入第一个switch的case 1分支,m++,m自增1,此时m为3,第一个switch执行结束,输出m为3
30、下列程序的运行结果为 num=3
#include<stdio.h> int main() {unsigned int v = 7;int num = 0;while (v) {v &= (v - 1);num++;}printf("num=%d", num);getchar();return 0; }
31、下列程序的运行结果为 36
#include<stdio.h> int main() {int i = 1, s = 1;while (i <= 10) {s += i += 2;}printf("%d", s);getchar();return 0; }
i=1,i<=10成立,赋值运算符从右往左算,i += 2,即i=i+2,即i为3, s +=3,即s=4。
i=3,i<=10成立,赋值运算符从右往左算,i += 2,即i=i+2,即i为5, s +=5,即s=9。
i=5,i<=10成立,赋值运算符从右往左算,i += 2,即i=i+2,即i为7, s +=7,即s=16。
i=7,i<=10成立,赋值运算符从右往左算,i += 2,即i=i+2,即i为9, s +=9,即s=25。
i=9,i<=10成立,赋值运算符从右往左算,i += 2,即i=i+2,即i为11, s +=11,即s=36。
i=11,i<=10不成立,输出s为36
32、下列程序的运行结果为 3360
#include<stdio.h> int main() {int i = 10, s = 2;while (i < 15) {s *= i; i += 2;}printf("%d", s);getchar();return 0; }
i=10,i<15成立,s*=i,即s=s*i,s=20,i+=2,i=i+2,i=12。
i=12,i<15成立,s*=i,即s=s*i,s=240,i+=2,i=i+2,i=14。
i=14,i<15成立,s*=i,即s=s*i,s=3360,i+=2,i=i+2,i=16。
i=16,i<15不成立,输出s为3360
33、下列程序的运行结果为 11
#include<stdio.h> int main() {int i, s = 1;for (i = 1; i < 10; i++);s += i++;printf("%d", s);getchar();return 0; }
注意for后面有一个分号,说明 s += i++;不是for结构里面的语句。for一直循环,直到i=10退出循环,s += i++;,赋值表达式从右往左计算,先执行i++,++在后先标后加,i++表达式的值为10,i的值为11,s +=10,即s=s+10,s为11
34、下列程序的运行结果为 10
#include<stdio.h> int main() {int i = 10, s = 0;while (i-- > 5) {s += 2;}printf("%d", s);getchar();return 0; }
i=10,--在后先标后减,i--表达式的值为10,i的值为9,i-->5成立,s += 2,即s=s+2,s为2
i=9,--在后先标后减,i--表达式的值为9,i的值为8,i-->5成立,s += 2,即s=s+2,s为4
i=8,--在后先标后减,i--表达式的值为8,i的值为7,i-->5成立,s += 2,即s=s+2,s为6
i=7,--在后先标后减,i--表达式的值为7,i的值为6,i-->5成立,s += 2,即s=s+2,s为8
i=6,--在后先标后减,i--表达式的值为6,i的值为5,i-->5成立,s += 2,即s=s+2,s为10
i=5,--在后先标后减,i--表达式的值为5,i的值为4,i-->5不成立,输出s为10
35、下列程序的运行结果为 0,1
#include<stdio.h> int main() {int i = 0;doprintf("%d,", i);while (i++);printf("%d\n", i);getchar();return 0; }
do-while先执行一次再判断条件是否成立,先输出0,,++在后,先标后加,i++表达式的值为0,i的值为1,do-while括号里面的条件不成立,输出i,结果为0,1
36、下列程序的运行结果为 0;0;1;2;3;4;5;6;7;8;9;
#include<stdio.h> int main() {int i = 0, j = 0;do {printf("%d;", i);for (j = i; j < 10; j++) {printf("%d;", j);}printf("\n");} while (++i < 1);getchar();return 0; }
do-while先执行一次再判断条件是否成立,i=0,先输出0;,进入for循环,直到j=10才结束循环,期间输出0;1;2;3;4;5;6;7;8;9;,++在前,先加后标,i自增1,i为1,++i表达式的值为1,++i < 1不成立,结束
37、下列程序的运行结果为 10
#include<stdio.h> int main() {int x = 1, b = 2;for (; x <= 4; x++) {b++;if (b > 10) {break;}else {b++;}}printf("%d", b);getchar();return 0; }
x=1,x <= 4成立,b++,b自增1,b为3,b > 10不成立,进入else分支,执行b++,b自增1,b为4
x++,x=2,x <= 4成立,b++,b自增1,b为5,b > 10不成立,进入else分支,执行b++,b自增1,b为6
x++,x=3,x <= 4成立,b++,b自增1,b为7,b > 10不成立,进入else分支,执行b++,b自增1,b为8
x++,x=4,x <= 4成立,b++,b自增1,b为9,b > 10不成立,进入else分支,执行b++,b自增1,b为10
x++,x=5,x <= 4不成立,跳出for循环,输出b为10