C语言期末考试复习PTA数据类型及表达式-分支结构程序-循环结构-数组经典选择题
C语言期末考试经典的选择判断题+代码分析。有些题目非常精彩,有很多的细节,帮你查缺补漏,拿下期末。
目录
第一章:C语言数据类型和表达式
第一题:
设x 、y均为f1oat型变量,则以下不合法的赋值语句是 ( )。
A.
x*=y+8;
B.
x=y=0;
C.
y=(x%2)/10;
D.
y=1+x;
分析:对于c,取余运算两边必须是整型;
第二题:
下面四个选项中,均是合法整形常量的选项是( )
A.
160 、 -0xffff 、 011
B.
-01 、 986,012 、 0668
C.
-0xcdf 、 01a 、 0xe
D.
-0x48a 、 2e5 、 0x
分析:首先你要知道十六进制的数怎么表示,它是以0x为前缀使用 0-9 和 A-F(或 a-f)这些字符来表示数字 0-15,然后八进制是以0为前缀,使用数字 0-7 来表示数字 0-7
所以b错在0668,八进制中出现了8,
c错在01a,八进制出现了字母
d错在2e5,是一个浮点数,不是整数,0x是不完整的十六进制表示
第三题:
表达式
下面的程序段将输出 ▁▁▁▁▁。
double pi = 22 / 7, r = 2, g;
g = 2 * pi * r;
printf("%.2f\n", g);
A.
12.57
B.
0.00
C.
12.00
D.
13.00
分析:
22/7,因为双方都是整数,所以得出结果也是整数不会保留小数,所以22/7=3,然后最后是输出12.00
第四题:
为表示“a和b都不等于0”,应使用的C语言表达式是()。
A.
(a!=0) || (b!=0)
B.
a || b
C.
!(a=0)&&(b!=0)
D.
a && b
分析:首先读懂题,翻译成a和b都不等于0时为真,所以d肯定对
接下来分析a,b,c
a用||逻辑符,就是只要两边一个满足就为真,那么a不等于0是为真,这个时候b可以为0,照样表达式成立
b同上
c的表达式就已经错了,因为()里面表达式应该是判断,而不是进行赋值
第五题:
设 x、y、t均为int型变量,则执行语句:x=y=3; t= ++x || ++y; 后,y的值为____。
A.
1
B.
不定值
C.
3
D.
4
分析:执行语句t=++x || ++y;,根据短路逻辑运算符的特性,如果第一个表达式的值为真(非零),则不会执行第二个表达式。先把++x赋给t之后,这个表达式为真不会进行++y。
第六题:
设变量n为float型,m为int类型,则以下能实现将n中的数值保留小数点后两位,第三位进行四舍五入运算的表达式是( )
A.
n=(n*100+0.5)/100.0
B.
n=n*100+0.5/100.0
C.
n=(n/100+0.5)*100.0
D.
m=n*100+0.5,n=m/100.0
分析:这道题看起来抽象,其实原理很简单,举个例子
假设n的值为3.4567。
按照选项A的表达式,首先计算 3.4567 * 100 = 345.67,将小数点后两位的数值变为整数部分。
接着加上0.5,得到 345.67 + 0.5 = 346.17,进行了四舍五入运算。
最后将结果除以100.0,得到 346.17 / 100.0 = 3.4617,将整数部分转换回小数点后两位的数值。
因此,选项A的表达式 (n*100+0.5)/100.0 能够实现将n中的数值保留小数点后两位,并进行四舍五入运算。
第七题:
表达式
下面的程序段将输出 ▁▁▁▁▁ 。
int n = 4, s;
s = 1 / 2 * n * (n + 1);
printf("%d\n", s);
A.
10
B.
0.025
C.
0.625
D.
0
思路:
写这种题,要明白优先运算的优先顺序,看s,先算小括号里的,然后从左至右一次运算,即先算1/2,但是1和2是整数运算得出0.5然后取整变成0,因此会输出0.
第八题:
表达式(x%3)等价于表达式( )。
A.
x%3 == 2
B.
x%3 == 0
C.
x%3 == 1
D.
x%3 != 0
思路:
写这种题记住一点,无需想太多,要想表达式x%3成立,那么x%3的结果就不能为0,因为我们规定表达式值为0就为假,因此表达式等价D。
第九题:
下列不合法的用户标识符是
A.
j2_KEY
B.
_8_
C.
4d_a
D.
Double
思路:用户标识符遵循特定规则:
- 用户标识符只能包含字母(大小写敏感)、数字和下划线。
- 用户标识符不能以数字开头。
- 用户标识符不能包含空格或其他特殊字符。
因此选C
第二章:分支结构程序设计
第一题:
若a为int类型,且其值为3,则执行完表达式a+= a-= a*a后,a的值是__。
A.
9
B.
-3
C.
6
D.
-12
思路:
明白运算符的优先顺序,*的优先级高于=和+,因此先从a*a开始运算,a的值为3,a*a=9,然后,a-=9,相当于a=a-9,这个时候a还是3,然后3-9=-6即把-6赋给了a,然后a这个时候的值为-6,然后进行最后一语句,a+=-6,a这个时候是-6,这个表达式相当于a=a-6,所以最后a=-12;
第二题:
定义int score = 75; 则表达式 80 > score > 70 的值是:
A.
0
B.
true
C.
1
D.
false
思路:
从左至右依次进行,首先80>75为真,那么这个时候表达式返回1,即变成1>70为假,所以返回0
第三题:
下列运算符中优先级最低的是__.
A.
II
B.
>=
C.
~
D.
!=
思路:这里给大家整这道题,也是想给大家总结这个运算符的优先级,记住常见的。
观察规律,一目运算符>二目运算符>三目运算符,算术运算符就是+ - * / 这些,关系运算符就是> < 这些,并且记住赋值运算符比 逗号运算符强。
因此这道题选择A
第四题:
设有定义:
int a = 1, b = 2, c = 3, d = 4, m = 2, n = 2;
则执行表达式
(m = a > b) && (n = c > d);
后,n的值为____。
A.
0
B.
3
C.
1
D.
2
思路:
由上述介绍了运算符的优先级,那么这道题就如同探囊取物,看表达式,先是a>b,即1>2,为假,返回0,即变成m=0,就是把0赋给了m,表达式为真,然后呢c>d即3>4为假返回0,0赋给了n为真,所以n等于0 对吗?不对,为什么?错就错在你还未理解&&这个运算符,必须两边同时成立才为真,但当左边的表达式为假的时候,他根本不会进行第二个表达式的运算,所以n还是原来的值2,因此这道题为D
这就是逻辑运算符的短路原则,对于||只要第一个操作数为假则不会进行第二个操作数.
对于逻辑或运算符 ||
,如果第一个操作数为真(非零),则整个表达式的值为真,不会再计算第二个操作数。只有当第一个操作数为假(0)时,才会计算第二个操作数。
第五题:
设 int x=1, y=1; 表达式(!x||y--)的值是( )。
A.
-1
B.
0
C.
1
D.
2
思路:
根据上题给大家介绍的逻辑运算符的短路规则,这道题很easy了吧
在这个表达式中,x
的值为 1,非零,所以 !x
为假(0)。因此,整个表达式 (!x || y--)
的值取决于 y--
的结果。
y--
表示先将 y
的值赋给表达式,然后再将 y
的值减 1。由于后缀自减运算符的优先级较低,所以 y--
的值为 1,并且 y
的值被减 1 变为 0。
因此,(!x || y--)
的值为 0 || 1
,即 1
。
答案是 C. 1。
第六题:
已知int i, a; 执行语句i=(a=2*3,a*5),a+6;后,变量i的值是( )。
A.
6
B.
30
C.
36
D.
12
思路:
还是考察运算符的优先级,之前给大家介绍=的优先级比 , 高,因此先执行逗号表达式a=2*3,a*5
,其中a首先被赋值为6,然后计算a*5
返回结果30,所以整个逗号表达式的值是30。接着,将这个值赋给变量i,即i=30
。
最后,执行语句a+6
,但并没有把其结果赋给任何变量,所以该语句的执行对i的值没有影响。
因此,变量i的值是30,选项B正确。
第七题:
若变量已正确定义,表达式 (j=3, j++) 的值是____。
A.
5
B.
4
C.
6
D.
3
思路:
在表达式(j=3, j++)
中,逗号操作符,
会先执行左边的表达式j=3
,将3赋值给变量j,然后再执行右边的表达式j++
。
但是需要注意的是,后置递增运算符++
会在整个表达式执行完之后才生效。所以在这个表达式中,尽管执行了j=3
的赋值操作,但是j++
的递增操作并没有影响到整个表达式的值。
因此,表达式(j=3, j++)
的值是3,选项D正确。
第八题:
设a=1,b=2,c=3,d=4,则表达式:a<b?a:c<d?a:d 的结果为( )。
A.
3
B.
4
C.
2
D.
1
思路:
对于这种多目运算的怎么分析?
答案就是一步步来,首先我们把这个值带进去,1<2为真所以a为表达式的值不执行后面。这里给大家延申一些,如果我是说如果,a<b为假的话,那么就会执行c<d,然后根据c<d是否为真进行判断是执行a还是执行d
第九题:
假设所有变量均为整型,则表达式(a = 2, b = 5, b++, a+b)的值是( )
A.
2
B.
7
C.
6
D.
8
思路:
在这个表达式中,首先执行 a = 2
,将 2 赋给变量 a
。然后执行 b = 5
,将 5 赋给变量 b
。接下来执行 b++
,将 b
的值增加 1,此时 b
的值为 6。最后执行 a + b
,即 2 + 6,结果为 8。
因此,表达式 (a = 2, b = 5, b++, a+b)
的值为 8。
在这里大家可能会有疑问,为什么不是7,因为b++只要不执行这个语句的时候b已经变成了6。如果说是还在b++这个语句里面,就是先用6然后再加1
第三章:循环结构
第一题:
下面这段程序,若scanf输入k的值为50,则程序将循环有限次,在打印输出有限行之后,程序将正常结束。
#include <stdio.h>
int main(){
int k;
scanf("%d", &k);
int i=100;
while(i > k){
printf("%d ", i);
i++;
}
return 0;
}
思路:
这道题,可能很多人都是一知半解,觉得i>k为真,并且i还自增,必然一直循环下去,但是要知道int类型的数据所表达的范围有限。
在这段程序中,如果 scanf
输入的 k
值为 50,并且 i
的初始值为 100,循环条件 i > k
成立,循环体内的语句会被执行。
每次循环中,会打印输出 i
的值,并将 i
的值递增 1。由于 i
是使用整型变量声明的,整型变量在大多数系统中的范围是有限的。当 i
递增到超过整型变量所能表示的最大值时,整型溢出会发生。
对于大多数系统来说,int
类型的范围是 -2,147,483,648 到 2,147,483,647。当 i
的值增加到超过这个范围时,它将溢出并变成一个负值。
因此,当 i
递增到超过 int
类型所能表示的最大值时,循环会终止,程序将正常结束。
第二题:
下面这段程序中的循环将是无限循环,程序将始终运行、无法结束(假设运行该程序的计算机系统永远不会发生意外情况而崩溃或断电)。
#include "stdio.h"
int main(){
for(long num=1; num>0; num++)
printf("%ld\n", num);
return 0;
}
思路:
这道题也是与上道题,同理
第三题:
下列程序段输出结果为 ____。
下列程序段输出结果为 ____。
int a=1,b=2,c=2,t;
while(a<b<c) { t=a; a=b; b=t; c--; }
printf( "%d,%d,%d", a, b, c);
思路:
首先看while循环条件,a<b即1<2为真返回1,变成1<c,即1<2为真然后进入循环体
然后看循环体前三条语句实际就是把a和b的值进行了交换,没看明白的可以画个图模拟一下,然后c--,这个时候c的值变成了1,接着再次进行循环条件的判断,a<b,因为a和b的值已经交换了,所以变成了2<1即为假,返回0,所以变成了0<c,c的值为1,所以0<1即为真,那么再次进入循环体,然后再次把a和b的值交换,这个时候a再次变成1b再次变成2,c再次--,c就变成了0,所以最终输出2,1,0
第四题:
对于循环while(!e) 语句,!e等价于____。
A.
e!=1
B.
e==0
C.
e!=0
D.
e==1
思路:
之前的内容讲过类似的,再次整出这道题想大家都整,明白,看懂代码,以后可能也需要写出这样的代码。
这次由大家自行解答,若有问题回到前文再看解析。
第五题:
设有程序段
int m=20; while (m=0) m=m++;
则下面描述中正确的是( )。
A.
循环体语句一次也不执行
B.
循环体语句执行一次
C.
while 循环执行 10 次
D.
循环是无限循环
思路:
这道题和前面的类似,答案由你来书写。
第六题:
执行下面的程序后变量a的值是
#include <stdio.h>
int main(void)
{
int a, b;
for (a = 1, b = 1; a <= 100; a++) {
if (b > 10)break;
if (b % 3 == 1) {
b += 3;
continue;
}
b -= 3;
}
printf("%d\n", a);
return 0;
}
A.
8
B.
5
C.
7
D.
6
思路:
这道题考察就是简单循环的理解,建议大家重新理一遍这道题的逻辑,不要直接用编译器来求答案,理解代码的逻辑。看懂代码。
第四章:数组
第一题:
在对数组全部元素赋初值时,不可以省略行数,但能省略列数。
T
F
思路:
对于二维数组,行数可以省略,列数不能省略,举个例子,arr[][3]={{1,2},{1,2,3}},省略了行数,并不影响我们的理解,明显可以得出行数为2。列数不能省略,如果不指定列数, 它就不能知道一行放几个数据了。
第二题:
若有定义float a[6]={1,2,3};,则数组中含有3个元素。
T
F
思路:
数组有6个元素,只不过只指定了前三个元素,那么后三个元素的值。
后三个元素的值不确定。
第三题:
调用strcmp函数比较字符串大小时,通常较长的字符串会较大。
T
F
思路:
字符串比较大小是按照字典序来比较,不是说字符串长就大。
第四题:
一维数组定义的一般形式如下,其中的数组长度是一个整型常量表达式,给定数组的大小。
类型名 数组名[数组长度];
T
F
思路:
记住即可,数字长度只能放常量不能放变量,比方说int a=100,arr[a]={0} 是错误的。因为a是变量。
第五题:
若字符数组s1和s2中均已正确存储字符串,则可以使用 if(s1>s2) 进行两字符串大小的比较。
T
F
思路:
不能直接通过关系运算符进行比较,除非在c++里面,可以通过strcmp来比较。
第六题:
一维数组定义的一般形式如下:
类型名 数组名[数组长度];
数组元素引用的一般形式如下:
数组名[下标]
在引用数组元素时,下标的合理取值范围是[0,数组长度-1],下标不能越界。
T
F
思路:
这个大家记住即可,答案为T
第七题:
"a" 和 'a'是等价的。
T
F
思路:
第一个是字符串,第二个是字符元素
第八题:
下面描述正确的是
A.
字符个数多的字符串比字符个数少的字符串大
B.
字符串“ STOP”和“STOP”相等
C.
字符串“That”小于字符串“The”
D.
两个字符串所包含的字符个数相同时才能比较字符串
思路:
看c因为第一个和第二个字符都相同,比较第三个,因为a的ascll小于e的ascll所以,第一个字符串小于第二个。
第九题:
以下关于二维数组初始化的说法,正确说法的个数是( )
(1)语句int a[2][3]={0}; 能将int型数组a中的每个元素全部初始化为0。
(2)语句int a[2][3]=0; 能将int型数组a中的每个元素全部初始化为0。
(3)语句int a[2][3]; 能将int型数组中a的每个元素全部初始化为0。
(4)语句int a[2][3]={{1,2},{3,4},{5,6}};能将int型数组元素a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2]依次初始化为1,2,3,4,5,6。
(5) 语句int a[][3]={1,2,3,4,5,6};能将int型数组元素a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2]依次初始化为1,2,3,4,5,6。
(6)语句int a[][3]={{1,2,3},{4,5,6}};能将int型数组元素a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2]依次初始化为1,2,3,4,5,6。
思路:
正确说法的个数是3。
(1)语句int a[2][3]={0}; 能将int型数组a中的每个元素全部初始化为0。—— 对,
(2)语句int a[2][3]=0; 能将int型数组a中的每个元素全部初始化为0。—— 错误,这种语句是错误的,无法用这种方式对二维数组进行整体赋值。
(3)语句int a[2][3]; 能将int型数组中a的每个元素全部初始化为0。—— 错误,这种方式只会在栈上分配空间,但不会对每个元素进行初始化。
(4)语句int a[2][3]={{1,2},{3,4},{5,6}};能够将int型数组元素a[0][0],a[0][1],a[1][0],a[1][1],a[0][2],a[1][2]依次初始化为1,2,3,4,5,6,因此是原来的选项是错的
(5) 语句int a[][3]={1,2,3,4,5,6};能将int型数组元素a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2]依次初始化为1,2,3,4,5,6。—— 对,。
(6)语句int a[][3]={{1,2,3},{4,5,6}};能将int型数组元素a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2]依次初始化为1,2,3,4,5,6。—— 正确,这种方式可以对二维数组进行逐个初始化。
第十题:
对于定义 char str[] = "abc\000def\n"(注:其中0为数字零),求字符串str的长度len和数组str的大小size,len和size分别是:
A.
3 ,9
B.
3 ,11
C.
12 ,13
D.
3 ,4
思路:
对于定义 char str[] = "abc\000def\n"; ,字符串 str 的长度 len 是指有效字符的个数,不包括字符串结束符 \0。数组 str 的大小 size 则是指整个数组占用的内存空间大小。
在这种情况下,字符串 str 的长度 len 为 3,因为 "abc" 是由三个有效字符组成。
数组 str 的大小 size 可以通过使用 sizeof 运算符来获取。sizeof 运算符返回的是数组在内存中所占用的字节数。
因为 str 是一个字符数组,所以它占用的内存空间大小等于每个元素的大小乘以元素的个数。每个字符元素的大小为 1 字节。
因此,数组 str 的大小 size 取决于编译器和操作系统的实现。通常情况下,它将是 11 字节(包括字符串结束符 \0)。
并且\0和\n看作是一个字符,字符串末尾还有一个\0为显示。
第十一题:
有说明语句int a[4][5]; ,则a[2]+3表示__。
A.
a数组行下标为2、列下标为3的元素的值
B.
a数组第3行的首地址
C.
a数组第2行的首地址
D.
a数组行下标为2、列下标为3的元素的地址
思路:
a[2]+3实际上表示a数组第3行的首地址,并且向后偏移3个元素的地址。因此,a[2]+3可以表示a数组行下标为2、列下标为3的元素的地址。
所以,选项D.a数组行下标为2、列下标为3的元素的地址是正确的答案。
第十二题:
以下定义语句中不正确的是__。
A.
int y[5]={0,1,3,5,7,9};
B.
double x[5]={2.0, 4.0, 6.0, 8.0, 10.0};
C.
char c1[]={'1', '2', '3', '4', '5'};
D.
char c2[]={'\x10', '\xa', '\x8'};
思路:
很明显A的数组越界了,因为数组下标从0,开始,最终最大也是y[4],只能存五个元素,而出现了6个就会越界。
最后,笔者能力有限,如有错误,请指出,一定改正一起进步。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)