单分支\双分支结构
一 、相关知识学习
if语句主要用于单分支、双分支和多分支条件判断结构。
if单分支结构
if语句格式:if(条件表达式) 语句块;
if为C语言的关键字;条件表达式描述对问题的条件判断,其结果值为0或1(假与真);语句块是条件成立时执行的语句,可以是一条语句或复合语句形式。
if单分支结构只执行条件为‘真’时的语句,执行过程如图1所示。
图1 if语句流程
如果表达式的值为真(非零),执行语句块的操作,否则(零),跳过语句块部分,接着执行后面的语句。例如:输出学生及格成绩的if语句:
if(grade>=60) /*满足成绩大于等于60的条件*/
printf("\n%d,passed\n",grade);
表达式通常为关系表达式或逻辑关系表达式。C语言通过检测表达式的值是否为0判断条件是否成立,如果表达式非0,即表示条件成立(逻辑真),否则不成立(逻辑假)。
if...else双分支结构
当条件为‘真’和为‘假’时都需要执行不同操作,可以采用if…else语句实现双分支选择结构。
语句格式:if (表达式) 语句块1;
else 语句块2;
if、else为C语言的关键字,由if引导条件为‘真’时执行的操作,由else引导条件为‘假’时执行的操作,else不能独立出现;语句块可以是一条语句或复合语句。 if …else语句的执行过程如图2所示。
图2 if…else语句流程
当表达式结果值为真时,执行语句块1,放弃语句块2的执行;当表达式结果值为假时,执行语句块2,放弃语句块1的执行。
对于一次条件判断,语句块1和语句块2只能有一个被执行,不能同时被执行。例如:对及格和不及格学生的成绩信息都要输出。
if(grade>=60)
printf("\n%d,passed\n",grade);/*及格信息*/
else
printf("\n%d,failed\n",grade);/*不及格信息*/
if...else if多分支结构
当一个问题有多种可能的条件,针对每种条件需要分别处理,执行不同语句时,采用if…else…if…语句。
语句格式: if(表达式1) 语句块1;
else if (表达式2) 语句块2;
else if(表达式e3) 语句块3;
…
else 语句Sn+1;
对于一次条件判断,只能选择一个分支被执行,不能同时被执行。首先,计算表达式1,如果为真,执行语句块1,否则,计算表达式2,如果为真,执行语句块2,否则,…,以此类推,直至计算表达式n,如果为真,执行语句块n,如果为假,此时如果有语句块Sn+1,则执行,否则,执行if…else…if…语句的下一条语句。执行过程如图3所示。
图3 if…else if语句流程
switch语句
当用某个变量或表达式单独测试每一个可能的整常量时,使用switch开关语句处理多分支选择结构,可以简化程序的结构。
语句格式: switch (表达式)
{
case 常量标号1:语句序列1;
break;
case 常量标号2:语句序列2;
break;
…
case 常量标号n:语句序列n;
break;
default: 语句S;
}
其中:switch、case、default均为C的关键字;表达式必须基于同一个整型变量,用以控制程序的执行过程;常量标号i(i=1,2,…,n),其类型应与表达式类型相同,根据表达式计算结果,在常量标号中查找,标号具有唯一性;语句序列允许由一条语句或多条语句组成,但不需要复合语句形式;break作为中断语句,在完成case分支规定的操作后直接跳出switch结构;default用于处理switch结构的条件非正常操作。switch执行过程如图4所示。
图4 switch语句执行流程图
switch语句的执行过程:
Step1:计算表达式的值。
Step2:将计算结果值依次与每一个case的常量标号进行比较。如果与某个case标号相等,执行该case标号后的语句序列;语句序列中如有break语句,则退出switch结构,整个switch多分支选择结构处理结束。如果没有break语句,则无条件执行下一条case语句(此时不需要对下一个case标号进行判断);
Step3:如果没有找到与计算结果值匹配的标号,则检查是否存在default标号,若有,则执行default后的语句,并结束switch语句的执行。若没有,则直接结束switch语句的执行。