引言
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它在编程语言中具有举足轻重的地位。
此文为【C语言必知必会】子系列第三篇,基于进行C语言选择结构的选择题专项练习,结合专题优质题目,带领读者从0开始,深度掌握知识点。
✈️文章目录
1️⃣ 前言
在【C语言必知必会】系列中,我们学习了顺序结构、选择结构、循环结构等,同时也通过专项练习进行了知识点的巩固和手敲代码的锻炼。
在子系列中,我们将基于PTA教学平台,向C语言学习者提供更优质的题目与更巧妙、精髓的解题思想与方法。
PTA是一个程序设计类实验辅助教学平台,由千名老师共同建设,里面包含了上万道高质量题目,用户量达百万。
在本讲中,将深入讲解选择结构的选择题,在思想上引领读者,带领读者在理论结合实际的基础上更好地学习、吸收、掌握C语言。
2️⃣PTA专项练习
接下来,开始我们的选择结构选择题专篇练习。
第一题
判断 i 和 j 至少有一个值为非0的表达式是。
A.i!=0 && j!=0
B.i+j!=0
C.i || j
D.i&&j
解题思路:
题目的意思是要判断出其中一个或者两个不为0
如果A的返回值为1,说明i和j都不等于0
如果A的返回值为0,说明i为0、j不为0 i不为0、j为0 i与j都为0
故A不满足
如果B的返回值为1,说明i+j不等于0,此时i可以为0、j不能为0或者j可以为0、i不能为0
如果B的返回值为0,说明i+j等于0,i与j可以为非0,也可以同时为0
故B不满足
如果C的返回值为1,说明i为0、j不为0 i不为0、j为0 i、j都不为0
如果C的返回值为0,说明i与j均为0
故C满足
如果D的返回值为1,说明i与j均不为0
如果D的返回值为0,说明i为0、j不为0 i不为0、j为0 i、j都为0
故D不满足,因此答案选C
第二题
表达式__不能用于判断“x和y不同时为零”。
A.x!=0 || y!=0
B.x || y
C.!(x==0 || y==0)
D.!(x==0 && y==0)
解题详析:
A:x为0,y不为0时, 0||1 等于1;x,y均为0时,0||0 等于0
故只要A的值为1,就能说明x和y不同时为0
B:x为0,y不为0时,结果为1;x为0,y为0时结果为0
故只要B的值为1,就能说明x和y不同时为0
C:x为0,y不为0的时候,结果为0;x为0,y为0的时候结果为1
故只要C的值为0,就能说明x和y不同时为0
D:x为0,y不为0的时候,结果为1;x为0,y为0的时候结果为0
故只要D的值为1,就能说明x和y不同时为0
本题无正解
第三题
表达式5>3>1
值是__.
A.0
B.1
C.3
D.表达式语法错误
解题详析:
5>3的结果为1
1>1的结果为0,因此选A
第四题
下列选项中用于判断ch
是否是字符的表达式是( )。
A.
( 'a' <= ch <= 'z' ) || ( 'A' <= ch <= 'Z' )
B.
( 'a' <= ch <= 'z' ) && ( 'A' <= ch <= 'Z' )
C.
( ch >= 'a' && ch <= 'z' ) && ( ch >= 'A' && ch <= 'Z' )
D.
( ch >= 'a' && ch <= 'z' ) || ( ch >= 'A' && ch <= 'Z' )
解题详析:
判断是否为字符包含两种:小写或大写,用到 || 因此选D
第五题
为表示关系x≥y≥z
,应使用C语言表达式( )。
A.
(x>=y)&&(y>=z)
B.
(x>=y)AND(y>=z)
C.
(x>=y>=z)
D.
(x>=y)&(y>=z)
较简单,选A
第六题
表达式8>6>3值是( )。
A.0
B.1
C.3
D.表达式语法错
解题详析:
8>6结果为1
1>3结果为0
选A
第七题
设 x
、y
、t
均为int
型变量,则执行语句:x=y=3; t= ++x || ++y;
后,y
的值为____。
A.不定值
B.3
C.4
D.1
解题详析:
在执行语句 x = y = 3; t = ++x || ++y;
后,我们来分析各个变量的值。
首先,根据赋值操作符的右结合性质,从右往左进行赋值。
++x
表示先将 x 的值加 1(此时 x 变为 4),然后将加 1 后的值赋给 t。- 由于逻辑或运算符的短路特性,如果第一个表达式为真,则不再执行第二个表达式。因此,在此情况下,
++y
不会被执行。
因为 ++x
的结果为真(非零),所以 t
被赋予 1
。
然后,y
仍然保持原来的值 3
。
综上所述,选项 B是正确答案。
第八题
如果要求在if
后一对括号中的表达式在表示a
不等于 0 的时候的值为“真”,则能正确表示这一关系的表达式为( )。
A.
a<>0
B.
!a
C.
a=0
D.
a
解题详析:
A. a <> 0
:C语言中不等于运算符通常是 !=
而不是 <>
,因此选项 A 不正确。
B. !a
:该表达式使用了逻辑非运算符 !
,表示取 a 的逻辑非(即取反)的结果。在此情况下,如果 a 的值为 0,则 !a
的值为真,否则为假。因此,选项 B 不正确。
C. a = 0
:该表达式使用了赋值运算符 =
,它将 0 赋给 a,并返回赋值后的结果。在 if 后的括号中,应该使用关系运算符来比较值,而不是赋值运算符。因此,选项 C 不正确。
D. a
:该表达式直接使用 a 变量作为条件,如果 a 的值为 0,则判断为假,否则为真。因此,选项 D 正确地表示在 a 不等于 0 的时候为真。
综上所述,选项 D 是正确答案。
第九题
能正确表示逻辑关系"a≥10 或 a≤0"的C语言表达式是()。
A.a>=10 or a<=0
B.a>=0 | a<=10
C.a>=10 && a<=0
D.a>=10 || a<=0
较简单,选D
第十题
在嵌套使用if语句时,C语言规定else总是()。
A.和之前与其具有相同缩进位置的if配对
B.和之前与其最近的if配对
C.和之前与其最近的且不带else的if配对
D.和之前的第一个if配对
基础知识点,选C
第十一题
下列叙述中正确的是()。
A.break语句只能用于switch语句
B.在switch语句中必须使用default
C.break语句必须与switch语句中的case配对使用
D.在switch语句中,不一定使用break语句
解题详析:
A错,break也可用于for语句跳出循环
B错,非必须
C错,与A一样
D对
第十二题
下列程序段的输出结果是()。
int main(void)
{
int a = 2, b = -1, c = 2;
if(a < b)
if(b < 0)
c = 0;
else c++;
printf("%d\n",c);
return 0;
}
解题详析:
格式化一下代码:
#include <stdio.h>
int main(void) {
int a = 2, b = -1, c = 2;
if (a < b) {
if (b < 0) {
c = 0;
}
else {
c++;
}
}
printf("%d\n", c);
return 0;
}
由于a<b不成立,所以if和else语句均不执行 c为原始值2
答案选C
第十三题
下列程序段的输出结果是 ()。
int main(void)
{
int x = 1, a = 0, b = 0;
switch(x)
{
case 0: b++;
case 1: a++;
case 2: a++; b++;
}
printf("a=%d,b=%d\n",a,b);
return 0;
}
解题详析:
x 的值为 1,匹配到 case 1,执行 a++,即将 a 的值加一。
因为在 switch 语句中没有 break 语句,所以程序将继续执行后续的 case 2。
执行 a++,再次将 a 的值加一。
执行 b++,将 b 的值加一。
switch 语句结束。
最终的输出结果为:
a=2, b=1
第十四题
能正确表示逻辑关系"a≥10 或 a≤0"的C语言表达式是()。
A.a>=10 or a<=0
B.a>=0 | a<=10
C.a>=10 && a<=0
D.a>=10 || a<=0
较为简单,选D
第十五题
能正确表示“当x的取值在[-58,-40]和[40,58]范围内为真,否则为假”的表达式是()。
A.(x>= -58) && (x<= -40) && (x>=40) &&(x<=58)
B.(x>= -58) || (x<= -40) || (x>=40) || (x<=58)
C.(x>= -58) && (x<= -40) || (x>=40) && (x<=58)
D.(x>= -58) | |(x<= -40) && (x>=40) || (x<=58)
较简单,选C
第十六题
以下程序段的输出结果是()。
int a=5, b=4, c=6, d;
printf("%d", d=a>b? a>c?a:c:b);
解题详析:
代码简化为
d = (a > b ? (a > c ? a : c) : b);
(a > c ? a : c)得到6
(a>b?6:b) 得到6
第十七题
已知int a=7,b=9,c=6;则c的结果是( ).
{
if(a<b)
if(b<0)c=0;
else c+=1;
printf("%d\n",c);
}
解题详析:
代码简化为
if(a<b){
if(b<0)
{
c=0;
}
else
{
c+=1;
}
}
printf("%d\n",c);
b>0,故执行c+=1,c为7
输出7 答案选D
第十八题
为表示x≥y≥z,须用的C语言表达式为( )。
A.(x>=y)&&(y>=z)
B.(x>=y)AND(y>=x)
C.x>=y>=z
D.(x≥y)&&(y≥z)
较为简单,选A
第十九题
判断a、b中有且仅有1个值为0的表达式是( )。
A. !(a*b)&&a+b
B.(a*b)&&a+b
C.a*b==0
D.a!=0 && !b
解题详析:
对A:a为0,b不为0的时候,值为1;都为0的时候值为0
所以A能判断
对B:a为0,b不为0的时候,值为0;a、b均为0的时候值为0
所以B不能判断
对C:仅一个为0和两个都为0都能满足等号条件
所以C不能判断
对D:a为0,b不为0的时候,值为0;a不为0,b为0的时候,值为1;都不为0的时候,值为0
所以D不能判断
因此选A
第二十题
当字符型变量ch 取何值(或何范围)时输出“YES”
char ch;
scanf("%c",&ch);
if(ch<='A'&&ch>='Z')
printf("NO");
else printf("YES");
A.大写字母A~Z
B.任何字符
C.除大写字母以外
D.大写字母B~Y
解题详析:
由于没有字符能满足既小于A又大于Z
所以只执行else语句 输出YES
第二十一题
当字符型变量ch 取何值(或何范围)时输出“YES”
char ch;
scanf("%c",&ch);
if(ch>='A'&&ch<='Z')
if(ch!='I'&&ch!='K')printf("NO");
else printf("YES");
A.I和K
B.除I和K以外的大写字母
C.除大写字母外的其他字符
D.大写字母
解题详析:
满足大写字母才能通过第一个if
满足等于I或等于K才能执行else
故选A
第二十二题
#include<stdio.h>
int main()
{ int x=1, y=0, a=0, b=0;
switch(x)
{ case 1:
switch(y)
{ case 0: a++;break;
case 1: b++;break;
}
case 2:
a++; b++; break;
}
printf("a=%d, b=%d\n",a,b);
return 0;
}
上面程序的输出结果是:
A.a=2, b=1
B.a=1, b=1
C.a=1, b=0
D.a=2, b=2
解题详析:
x为1 进入case1
y为0 a自增变为1
进入case2
a自增,b自增,a为2,b为1
故选A
第二十三题
若a,b,c1,c2,x,y均是整型变量,正确的switch语句是:
A.
switch(a-b)
{ default: y=a*b; break;
case 3: case 4: x=a+b; break;
case 10: case 11: y=a-b; break;
}
B.
switch(a+b);
{ case 1: y=a+b; break;
case 0: y=a-b; break;
}
C.
switch(a*a+b*b)
{ case 3:
case 1: y=a+b; break;
case 3: y=b-a; break;
}
D.
switch a
{ case c1: y=a-b; break;
case c2: x=a*d; break;
default: x=a+b;
}
解题详析:
B:switch一行不能出现;
C:出现两个case3
D:应写为switch (x)的形式
default可出现在switch语句中的前面和后面,故答案选A
第二十四题
以下程序的功能是输入三个数,比较后输出三个数中的最大值,请在下列选项中挑出正确的语句将程序补充完整。
#include <stdio.h>
int main(void)
{ int x,y,z,u,v;
scanf(“%d%d%d“,&x,&y,&z) ;
if( (1) )
u=x;
else
u=y;
if( (2) )
v=u;
else
v=z;
printf(“%d\n”, v);
return 0;
}
A.
(1) x<y (2) u<z
B.
(1) x<y (2) u>z
C.
(1) x>y (2) u>z
D.
(1) x>y (2) u<z
解题详析:
最后输出的是v,说明v最大
第一个if是比较x和y,把x,y中大者赋值给u
第一个if是比较u和z,把u,z中大者赋值给v
故答案选C
第二十五题
下列程序段输出结果为 ( )。
int x = -3, y = 4;
if (x<y)
x = -x;
else
if (x>y)
y = -y;
printf("%d,%d", x, y);
A.3,-4
B.-3,-4
C.3,4
D.-3,4
仅执行第一条if语句内容,故选C
第二十六题
若 int i=10; 执行下列程序后,变量 i 的正确结果是( )。
switch (i) {
case 9: i+=1 ;
case 10: i+=1 ;
case 11: i+=1 ;
default : i+=1 ;
}
A.10
B.11
C.12
D.13
由于没有break,语句会持续执行
故i变为13,选D
第二十七题
若执下面程序时从键盘上输入5,则输出是
main()
{
int x;
scanf("%d",&x);
if(x++>5) printf("%d\n",x);
else printf("%d\n",x--);
}
A.7
B.6
C.5
D.4
解题详析:
x++变为6,6>5,执行printf(“%d\n”,x);语句
因此输出为6,选B
第二十八题
已知int x=10,y=20,z=30;以下语句:if(x>y) z=x; x=y; y=z;执行后x,y,z的值是( )。
A.x=10, y=20, z=30
B.x=20, y=30, z=30
C.x=20, y=10, z=10
D.x=20, y=30, z=10
解题详析:
代码格式化为
if(x>y)
{
z=x;
}
x=y;
y=z;
执行x=y;y=z;
故x为20,y为30,z为30
答案选B
第二十九题
能正确表示a和b同时为正或同时为负的逻辑表达式是_________。
A.(a>=0‖b>=0)&&(a<0‖b<0)
B.(a>=0&&b>=0)&&(a<0&&b<0)
C.(a+b>0)&&(a+b<=0)
D.a*b>0
该题较简单,选D
第三十题
若要求:当数学式3<x<7成立时,使得y=1,且设x、y为int型变量,则以下能够实现这一要求的选项是( )。
A.if(x>3)
if(x<7) y=1;
B.if(x>3||x<7) y=1;
C.if(x<3) y=1;
else if(x<7) y=1;
D.if(!(x<=3)) y=1;
else if(7>x) y=1;
解题详析:
B:为或,不满足题意
C:else语句不符合题意
D:逻辑与题目所给条件不符
故选A
3️⃣ 总结
此文为 【C语言必知必会】子系列之第三篇 ,通过以题代练的形式带领读者掌握C语言的选择结构,带领读者从0开始,深度掌握知识点。
以题代练对于C语言的学习是十分重要的,专栏将持续提供优质C语言编程题与理论课的学习,带领读者全方位掌握C语言,读者可订阅专栏持续跟进。