【C语言必知必会 | 子系列第三篇】深入剖析选择结构(1)

引言

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


第七题

xyt均为int型变量,则执行语句:x=y=3; t= ++x || ++y; 后,y的值为____。

A.不定值

B.3

C.4

D.1

解题详析:

在执行语句 x = y = 3; t = ++x || ++y; 后,我们来分析各个变量的值。

首先,根据赋值操作符的右结合性质,从右往左进行赋值。

  1. ++x 表示先将 x 的值加 1(此时 x 变为 4),然后将加 1 后的值赋给 t。
  2. 由于逻辑或运算符的短路特性,如果第一个表达式为真,则不再执行第二个表达式。因此,在此情况下,++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语言,读者可订阅专栏持续跟进。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏,祝你平安喜乐。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值