认识分支结构

本文详细介绍了C语言中if和switch语句的用法,包括基本语法、嵌套结构、else的使用、悬空else问题、switch语句的case和default分支以及break的重要性。
摘要由CSDN通过智能技术生成

C语言是一种结构化的程序设计语言,这里的结构指顺序结构、分支结构、循环结构。我现在要讲的就是分支循环。想要实现分支循环我们可以使用 if 语句和 switch 语句。

1.if 语句

1.1 if

以下是 if 语句的语法形式:

if ( 表达式 )
 语句

表达式成立,为真;表达式不成立,为假,则语句不执行。

举个例子:

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age >= 18)
		printf("你今年%d岁,是成年人", age);
	return 0;
}

在C语言中,0为假,非0为真,如果表达式的结果是0的话,则语句不执行,表达式结果如果不为0,则语句执行。

1.2 else

在上面举了一个例子来判断是否成年了,如果大于或等于18岁就是成年了,反之则是未成年。要怎样表示出来呢?

这时就需要 if…else…语句了,形式如下:

if (表达式)
    语句1
else
    语句2

例子:

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age >= 18)
		printf("你今年%d岁,是成年人", age);
    else
        printf("你今年%d岁,是未成年人", age);
	return 0;
}
1.3 分支中包含多条语句

在 if 和 else 语句中都默认只控制一条语句,比如:

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age >= 18)
		printf("你是成年人了\n");
        printf("可以谈恋爱了\n");
	return 0;
}

这是因为 if 语句只能控制一条语句,就是 printf(" 成年了 \n"); ,if语句为真,则打印成年了,if 语句为假,则不打印,对于 printf(" 可以谈恋爱了 \n"); 是独立存在的,不管if语句的条件的真 假,都会被执行。那如果我们要if语句同时控制2条语句,怎么办呢?那就要使用 {} 将代码括起来, else 后也可以跟上大括号。如下:

1.4 嵌套 if

if…else…语句中,else 可以与另一个 if 语句连用,构成多重判断。

打个比方:假如我们要判断一个数字是整数0,还是整数或负数。

代码如下:

#include <stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num == 0)
		printf("输⼊的数字是0\n");
	else if (num > 0) //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构
		printf("输⼊的数字是正数\n");
	else
		printf("输⼊的数字是负数\n");

	return 0;
}

再比如:

输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:非正数。
#include <stdio.h>
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num > 0)
	{
		if (num % 2 == 0)
			printf("偶数\n");
		else
			printf("奇数\n");
	}
	else
	{
		printf("⾮正数\n");
	}
	return 0;
}
1.5 悬空else问题

如果有多个 if 和 else,可以记住,else 总是跟最接近的 if 匹配。

举个例子:

#include <stdio.h>
 int main()
 {
     int a = 0;
     int b = 2;
     if(a == 1)
         if(b == 2)
             printf("hehe\n");
     else
         printf("haha\n");
     return 0;
}
很多初学者,上来以判断 a 是 0,不等于 1 ,那就执行  else ⼦句,打印 haha 但是当你去运⾏代码,输出的结果是:啥都不输出。

yH5BAAAAAAALAAAAAAOAA4AAAIMhI+py+0Po5y02qsKADs=wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

为什么呢?

这就是悬空 else 的问题,如果有多个 if else ,可以记住这样一条规则, else 总是跟最接近
if 匹配。
上面的代码排版,让 else 和第一个 if 语句对齐,让我们以为 else 是和第一个if匹配的,当 if
语句不成立的时候,自然想到的就是执行  else 子 句,打印 haha ,但实际上 else 是和第二个 if
进行匹配的,这样后边的 if...else 语句是嵌套在第一个 if 语句中的,如果第一个 if 语句就不
成立,嵌套 if else 就没机会执行了,最终啥都不打印。

如果将代码改成下面这样会更加容易理解:

#include <stdio.h>
int main()
{
    int a = 0;
    int b = 2;
    if(a == 1)
    {
        if(b == 2)
            printf("hehe\n");
        else
            printf("haha\n");
    }
    return 0;
}

带上适当的大括号会使代码的逻辑更加清晰,所以大家以后在写代码的时候要注意括号的使用,让代码的可读性更高。

2. switch语句

除了 if 语句外,C语言还提供了 switch 语句来实现分支结构。
switch 语句是一种特殊形式的 if...else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。
switch (expression) 
{
 case value1: statement
 case value2: statement
 default: statement
}
上面代码中,根据表达式 expression 不同的值,执行相应的 case 分支 。如果找不到对应的值,就执行  default 分支。
注意:switch 后的 expression 必须是整型表达式,case 后的值,必须是整形常量表达式

2.1 if语句和switch语句的使用对比

例子:输入任意一个整数值,计算除3之后的余数。

如果使用 if 语句完成是下面这样的效果:

#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    if(n%3 == 0)
        printf("整除,余数为0\n");
    else if(n%3 == 1)
        printf("余数是1\n");
    else
        printf("余数是2\n");
    return 0;
}

如果使用 switch 语句改写的话是这样子的:

#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    switch(n%3)
    {
    case 0:
        printf("整除,余数为0\n"); 
        break;
    case 1:
        printf("余数是1\n"); 
        break;
    case 2:
        printf("余数是2\n"); 
        break;
    }
    return 0;
}

在上述的代码中,我们要注意: case 和后面的数字之间必须有空格。每一个 case 语句中的代码执行完成后,需要加上 break,才能跳出这个switch 语句。

2.2 switch 语句中的 break
前面的代码中,如果我们去掉 case 语句中的 break,会出现什么情况呢?
#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	switch (n % 3)
	{
	case 0:
		printf("整除,余数为0\n");
	case 1:
		printf("余数是1\n");
	case 2:
		printf("余数是2\n");
	}
	return 0;
}

我们测试一组,结果如下:

结果我们发现,10除以3本来余数是1,但是我们发现程序运行的结果多了一行“余数是2”的打印。
这是为什么呢?
这是因为   switch 语句也是分支效果的,只有在 switch 语句中使用  break 才能在跳出 switch
句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执行,有可能执行其他 case
语句中的代码,直到遇到 break 语句或者 switch 语句结束。就比如上面的代码就执行了 case 2 中的语句。
所以在 switch 语句中 break 语句是非常重要的,能实现真正的分支效果。
当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。
2.3 switch 语句中的 default
在使用  switch 语句的时候,我们经常可能遇到一种情况,比如 switch 后的表达式中的值无法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加入 default 子句。
switch (expression) 
{
 case value1: statement
 case value2: statement
 default: statement
}
当switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执行 default 子句。

再举个例子:输入1~7这7个数字,输入1就输出星期一,输入2就输入星期二……,如果输入的数字不在1~7的范围内就输出“输入错误”这四个字。

#include <stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("星期⼀\n");
		break;
	case 2:
		printf("星期⼆\n");
		break;
	case 3:
		printf("星期三\n");
		break;
	case 4:
		printf("星期四\n");
		break;
	case 5:
		printf("星期五\n");
		break;
	case 6:
		printf("星期六\n");
		break;
	case 7:
		printf("星期天\n");
		break;
	default:
		printf("输入错误\n");
		break;
	}
	return 0;
}
2.4 swicth 语句中的 case 和 default 的顺序问题
switch 语句中 case 子 句和 default 子 句有要求顺序吗? default 只能放在最后吗?
其实,在 switch 语句中 case 语句和 default 语句是 没有顺序要求的 ,只要你的顺序是满足实际需求的就可以。
不过我们通常是把 default 子 句放在最后处理的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值