目录
传送门-上一节:C语言程序设计-分支语句:if语句及嵌套(if-else)、switch语句
3.6 提高部分
3.6.1 if语句和switch语句的进一步讨论
在3.3节和3.4节中,已经介绍了if、switch语句的一般形式及使用方法,由于这两个语句的形式灵活,在使用时容易误操作,下面再举一些例题。
【例 3.13】分析下面程序的执行过程。
#include<stdio.h>
int main(void)
{
int a = 0, b = 0, x = 0;
scanf("%d%d", &a, &b);
if (a > b) //外层if子句是另外一个if语句
if (b > 0) //---
x = a + 1; //---内嵌if子句 //---
else //---外层if子句
x = a - 1; //---内嵌else子句 //---
else //外层else子句也是另一个if语句
if (a > 0) //---
x = b + 1; //---内嵌if子句 //---
else //---外层else子句
x = b - 1; //内嵌else子句 //---
printf("a=%d,b=%d,x=%d\n", a, b, x);
}
【解】第一次运行结果:
7 5
a=7,b=5,x=8
第二次运行结果:
7 -5
a=7,b=-5,x=6
第三次运行结果:
1 8
a=1,b=8,x=9
第四次运行结果:
-1 8
a=-1,b=8,x=7
本程序是属于if语句的嵌套,外层if语句中的if子句和else子句都是另一个if语句。
嵌套if语句的一般形式如下:
执行过程:
若表达式1的值为非0时,则执行外层if子句;否则,执行外层else子句。当执行外层if子句时,如果表达式2的值为非0,则执行外层if子句的内嵌if子句;否则,执行内嵌else子句;当执行外层else子句时,如果表达式3的值为非0,则执行外层else子句的内嵌if子句;否则执行内嵌else子句(如图3.8所示)。
图 3.8 嵌套if语句一般形式的N-S图
说明:
(1)嵌套的if语句在语法上是一条语句。
(2)if子句或else子句中,可以包括多条内嵌if语句。
(3)常见的嵌套if语句,一般只在if子句中或只在else子句中包含其他if语句。
(4)外层if语句可以是不带else的if语句,if子句或else子句包含的内嵌if语句也可以是不带else的if语句。使用嵌套if语句时,一定要注意if与else的配对关系,else总是与离它最近的上一个尚未匹配的if配对。
【例 3.14】在下面4个程序段中,找出能实现以下分段函数值的程序段。
程序段A:
if (x > 0) y = 1;
else //隐含x<=0
if (x == 0) y = 0;
else y = -1; //隐含x<=0且x!=0 即x<0
程序段B:
if (x > 0)
if (x > 0) y = 1; //隐含x>=0且x>0 即x>0
else y = 0; //隐含x>=0且x<=0 即x=0
else y = -1; //隐含x<0
程序段C:
y = 0;
if (x > 0) y = 1;
else //隐含x<=0
if (x < 0) y = -1;
程序段D:
y = 0;
if (x >= 0)
if (x > 0) //隐含x>=0且x>0 即x>0
y = 1;
else //隐含x>=0且x<=0 即x=0
y = -1;
【解】
(1)程序段A是在else子句中嵌套了if-else语句;程序段B是在if子句中嵌套了if-else语句;程序段C是在else子句中嵌套了if语句(无else子句)。程序段A、B、C都能实现以上功能,读者可以用各种数据进行测试,我们在这里就不一一测试了。
(2)程序段D是在if子句中嵌套了if-else语句,此程序段不能实现以上功能,因为else与它上一行的if配对。在C语言中书写格式(如缩进格式)不能影响else与if的配对关系。
如果把此程序段改为如下形式就可实现以上功能。
y = 0;
if (x >= 0)
{ if (x > 0) y = 1; } //复合语句,是完整的一条语句
else
y = -1;
说明:
(1)对于同一个问题,可以用不同形式嵌套的if语句来解决;既可以在if子句中嵌套;也可以在else子句中嵌套;可以既有if语句,又有else语句的嵌套;也可以只有if语句,无else语句的嵌套,但不论使用哪一种方法一定要弄清变量前后的逻辑关系。在if子句中嵌套时应注意:else总是与离它最近的上一个尚未匹配的if配对,与书写形式无关,这是初学者比较容易出错的地方。
(2)建议读者使用嵌套的if语句时,尽量在else子句中嵌套if语句,因为内嵌在else子句中的if语句无论是否有else子句,在语法上都不会引起误会,这样不仅减少出错,也比较容易阅读,用不断在else子句中嵌套if语句的方式形成多层嵌套,形式如下:
if(表达式1) 语句1
else
if (表达式2) 语句2
else
if (表达式3) 语句3
else
...
else 语句n
此语句常用以下形式表示:
if(表达式1) 语句1
else if (表达式2) 语句2
else if (表达式3) 语句3
...
else 语句n
用以上语句形式表示,可使程序读起来既层次分明又不占太多的篇幅。此形式的嵌套if语句执行过程是:从上向下逐一对if后的表达式进行检测。当某一个表达式的值为非0时,就执行与此有关子句中的语句,阶梯形中的其余部分就被跳过去。如果将所有表达式的值都为0,则执行最后的else子句。如果没有最后的那个else子句,将不进行任何操作。
【例 3.15】编写一个控制提前退出switch语句体的程序。
#include<stdio.h>
void main()
{
int a = 0, n1 = 0, n2 = 0, n3 = 0;
scanf("%d", &a);
switch (a)
{
case 1:n1++; break;
default:n3++;
case 3:
case 2: n2++; break;
}
printf("a=%d,n1=%d,n2=%d,n3=%d\n", a, n1, n2, n3);
}
第一次运行结果:
1
a=1,n1=1,n2=0,n3=0
第二次运行结果:
2
a=2,n1=0,n2=1,n3=0
第三次运行结果:
3
a=3,n1=0,n2=1,n3=0
第四次运行结果:
8
a=8,n1=0,n2=1,n3=1
程序说明:
(1)以上程序在switch语句体内使用了break语句,它的作用是退出本switch语句体。当程序执行入口标号右边语句时,只有遇到break语句,就立即退出本switch语句体;如果没有遇到break语句,则程序继续往下执行,直至遇到下一条break语句或switch语句被执行完毕。在switch语句体内使用break语句才可以真正起到分支作用。
(2)case标号和default标号在switch语句体内的位置任意,但case后面的各常量表达式的值必须互不相同。
(3)入口标号右边可以没有语句,也可以有多条语句,当有多条语句时,不必用花括号括起来,这样可以根据具体的分支情况灵活运用switch语句。
【例 3.16】编写一个含有嵌套switch语句的程序。
#include<stdio.h>
void main()
{
int x = 1, y = 10, z = 20, n = 0;
switch (x)
{
case 1:
switch (y)
{
case 10: n++; break; //执行n++;后退出内层switch语句体
case 11: n++; break;
}
case 2:
switch (z)
{
case 20: n++; break; //执行n++;后退出内层switch语句体
case 21: n++; break;
}
break; //因有此语句,退出外层switch语句体
case 3: n++; break;
}
printf("n=%d\n", n); //case1和case2后没有break; 所以执行完case1的内层switch后会进入case2的内层switch。
}
运行结果:
n=2
程序说明:
在switch语句体中包含其他switch语句的switch语句称为嵌套的switch语句。在嵌套的switch语句中使用break语句时,一定要弄清退出哪个switch语句体。请注意,break语句只能退出本层的switch语句体。
3.6.2 条件运算符和表达式
1. 条件运算符
条件运算符由“?”和“:”组成,它需要3个运算量。条件运算符的优先级数值是13,结合方向是自右至左。
2. 条件表达式
x>0?1:-1是一个条件表达式,其条件表达式的值由x>0的“真”与“假”决定。当x>0的值为非0时,条件表达式的值为1,否则为-1.条件表达式的一般形式是:
表达式1 ?表达式2 :表达式3
若表达式1的值为非0,则以表达式2的值作为条件表达式的值;否则,以表达式3的值作为条件表达式的值。由于赋值运算符的优先级比条件运算符低,语句“y=x>0?1:-1;”相当于“y=(x>0?1:-1);”,因此等价于:
if(x>0) y=1;
else y=-1;
【例 3.17】将语句“y=x>0?x:x==0?0:-x;”改写成if语句。
【解】由于条件运算符的结合方向是由右至左,该语句相当于“y=x>0?x:(x==0?0:-x);”,因此等价于:
if(x>0) y=x;
else if(x==0) y=0;
else y=-x;
从上面的if语句可以看出,此语句的作用是求x的绝对值,因此与“y=fabs(x);”等价(其中fabs是求绝对值的库函数)。
传送门🚪来喽~
传送门-上一节:C语言程序设计-分支语句:if语句及嵌套(if-else)、switch语句
You must be yourself.