C语言基础 — ( 选择程序设计[ 选择结构、条件判断 ] )

欢迎小伙伴的点评✨✨ 本篇章系列是对C语言的深度思考和总结、关于C语言内容会持续更新。


前言

在顺序结构中,各语句是按自上而下的顺序执行的,执行完上一个语句就自动执行下一个语句,是无条件的,不必作任何判断。这是最简单的程序结构。实际上,在很多情况下,需要根据某个条件是否满足来决定是否执行指定的操作任务,或者从给定的两种或多种操作选择其一。这就是选择结构要解决的问题。


一、选择程序简介

由于程序处理问题的需要,在大多数程序中都会包含选择结构,需要在进行下一个操作之前先进行条件判断。
C语言有两种选择语句:
(1) if 语句,用来实现两个分支的选择结构;
(2) switch 语句,用来实现多分支的选择结构。

二、if 语句的选择结构

2.1、if 语句的一般形式如下:

if (表达式) 语句1
[ else 语句2]
if 语句中的“表达式”可以是关系表达式、逻辑表达式,甚至是数值表达式。其中最直观、最容易理解的是关系表达式。所谓关系表达式就是两个数值进行比较的式子。在上面 if 语句的一般形式中,方括号内的部分(即 else子句)为可选的,既可以有,也可以没有。
语句1和语句2可以是一个简单的语句,也可以是一个复合语句,还可以是另一个 if 语句
(即在一个 if 语句中又包括另一个或多个内嵌的 if语句)。
根据 if语句的一般形式,if 语句可以写成不同的形式,最常用的有以下3种形式:
(1) if (表达式) (没有 else子句部分)
语句 1
(2) if (表达式) (有 else子句部分)
语句 1
else
语句 2
(3) if (表达式 1) (在 else部分又嵌套了多层的 if 语句)
语句 1
else if (表达式 2)
语句 2
else if(表达式 3)
语句 3

else if(表达式 m)
语句 m
else
语句 m+1

说明:
(1)整个 if 语句可以写在多行上,也可以写在一行上。
如:
if(x>0) y=1;else y = -1;
但是,为了程序的清晰,提倡写成锯齿形式。
(2)一般形式(3)中“语句1”语句2”语句 m”等是 if 语句中的“内嵌语句”。它们是 if 语句中的一部分。每个内嵌语句的末尾都应当有分号,因为分号是语句中的必要成分。
如: if (x>0)
y = 1; //语句末尾必须有分号
else
y = -1; //语句末尾必须有分号
不能写成:
if(x>0) y = 1 else y= -1; //“语句1”的末尾缺少分号
如果无此分号,则出现语法错误。
(3) if 语句无论写在几行上,都是一个整体,属于同一个语句。不要误认为 if 部分是一个语句, else 部分是另一个语句。不要一看见分号,就以为是 if 语句结束了。在系统对 if 语句编译时,若发现内嵌语句结束(出现分号),还要检查其后有无 else,如果无 else,就认为整个 if 语句结束,如果有else,则把 else 子句作为 if 语句的一部分。注意 else 子句不能作为语句单独使用,它必须是 if语句的一部分,与 if 配对使用。

(4)“语句1”语句2”….“语句m”可以是一个简单的语句,也可以是一个包括多个语句的复合语句。注意:复合语句应当用花括号括起来。
(5)内嵌语句也可以是一个 if 语句,它也包含else部分。
(6)在 if 语句中要对给定的条件进行检查,判定所给定的条件是否成立。
判断的结果是一个逻辑值 “是” 或 “否” 。

2.2、if 语句的选择嵌套:

在 if 语句中又包含一个或多个 if 语句称为 if 语句的嵌套(nest)。
其一般形式如下:
if()
if() 语句 1
else 语句 2
else
if() 语句 3
else 语句 4

应当注意 if 与 else 的配对关系。else 总是与它上面的最近的未配对的 if 配对。

三、switch 语句的选择结构

if 语句只有两个分支可供选择,而实际问题中常常需要用到多分支的选择。
当然这些都可以用嵌套的 if 语句来处理,但如果分支较多,则嵌套的 if 语句层数多,程序冗长而且可读性降低。C语言提供switch 语句直接处理多分支选择。
switch 语句是多分支选择语句。
switch语句的一般形式如下:

switch(表达式)
{
case 常量1:语句 1
case 常量2:语句 2

case 常量n:语句 n
default : 语句 n+1
}

说明
(1) 上面 switch 一般形式中括号内的“表达式”,其值的类型应为整数类型(包括字符型)。
(2) switch 下面的花括号内是一个复合语句。这个复合语句包括若干语句,它是switch 语句的语句体。语句体内包含多个以关键字 case 开头的语句行和最多一个以default 开头的行。case 后面跟一个常量(或常量表达式),如: case ‘A’,它们和 default 都是起标号(label,或称标签、标记)的作用,用来标志一个位置。执行 switch 语句时,先计算switch 后面的“表达式”的值,然后将它与各 case 标号比较,如果与某一个 case 标号中的常量相同,流程就转到此 case 标号后面的语句。如果没有与 switch 表达式相匹配的 case 常量,流程转去执行 default 标号后面的语句。
(3)可以没有 default 标号,此时如果没有与 switch 表达式相匹配的 case 常量,则不执行任何语句,流程转到 switch 语句的下一个语句。
(4)各个 case 标号出现次序不影响执行结果。例如,可以先出现 default 标号,再出现“case’D’:…”,然后是“case ‘B’:…”0
(5)每一个 case 常量必须互不相同;否则就会出现互相矛盾的现象(对 switch 表达式的同一个值,有两种或多种执行方案)。
(6) case 标号只起标记的作用。在执行 switch 语句时,根据 switch 表达式的值找到匹配的入口标号,并不在此进行条件检查,在执行完一个case标号后面的语句后,就从此标号开始执行下去,不再进行判断。
注意: 一般情况下,在执行一个case 子句后,应当用break 语句使流程跳出 switch 结构,即终止switch语句的执行。最后一个case 子句(今为default 子句)中可不必加 break 语句,因为流程已到了switch
结构的结束处。
(7)在 case 子句中虽然包含了一个以上执行语句,但可以不必用花括号括起来,会自动顺序执行本 case 标号后面所有的语句。当然加上花括号也可以。
(8)多个 case 标号可以共用一组执行语句,例如:
case ‘A’:
case ‘B’:
case ‘C’:printf(“>60\n”);break;
当grade 的值为’A’,‘B’,'C’时都执行同一组语句,输出“>60”,然后换行。

四、三目(条件)运算符的选择结构

条件运算符由两个符号(? 和 :)组成,必须一起使用。要求有3个操作对象,称为三目(元)运算符,它是C语言中唯一一个三目运算符。
条件表达式的一般形式为
表达式 1 ? 表达式 2 :表达式 3
说明:

(1)条件运算符的执行顺序:
先求解表达式1,若为非0(真)则求解表达式2,此时表达式2的值就作为整个条件表达式的值。
若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。
赋值表达式
max=(a>b) ? a :b
的执行结果就是将条件表达式的值赋给 max,也就是将a和b二者中的大者赋给 max。
(2)条件运算符优先于赋值运算符,因此赋值表达式的求解过程是先求解条件表达式,再将它的值赋给 max。
(3)上面的例子是利用了条件表达式的值,把它赋给一个变量 max。
其实也可以不把条件表达式的值赋予一个变量,而在条件表达式中的表达式2和表达式3中对 max 赋值,并在条件表达式后面加一个分号,就成为一个独立的语句。如:
a>b?(max=1):(max=b);//表达式2和表达式3是赋值表达式
相当于:
if(a>b) max = a;
else max = b ;
条件表达式还可以写成以下形式:
a>b ? printf(“%d”,a) : printf(“%d”,b)
即“表达式 2”和 “表达式 3” 不仅可以是数值表达式 ,还可以是赋值表达式或函数表达式。
上述条件表达式相当于以下 if … else 语句:
if ( a>b)
printf(“%d”,a);
else
printf(“%d”,b);

五、总结

实际应用中,在很多情况下,需要根据某个条件是否满足来决定是否执行指定的操作任务,或者从给定的两种或多种操作选择其一。
因此在实际应用中选择结构是非常重要且使用频繁的结构。

猜你喜欢

转载自blog.csdn.net/weixin_44759598/article/details/128522647