C语言程序设计-if语句和switch语句的进阶、条件运算符和表达式

目录

3.6 提高部分

3.6.1 if语句和switch语句的进一步讨论

3.6.2 条件运算符和表达式

传送门-上一节: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.

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值