分支(选择)语句

Posted 胖仙人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分支(选择)语句相关的知识,希望对你有一定的参考价值。

为了更好的阅读体验,建议前往作者个人知识库主页阅读

Part 1概念简介

一、语句

由一个分号间隔开的,就是一条语句,如:

int a = 10;

就是一条语句

二、C语言中的三种结构

①顺序结构

②选择结构

③循环结构


Part 2 分支语句

一、if语句基础语法

①单分支

>语法格式

if(条件表达式)
{
	语句;
}

>Code Ⅰ

int main()
{
    int age = 20;
	if(age>=18)
    {
    	printf("成年\\n");
    }
    return 0;
}

[解析]

①if后的括号内是一条会产生结果的表达式,如上述代码中,表达式的含义为判断年龄是否大于等于18,如果大于等于18,则表达式产生的结果为真(即满足条件),这时会继续执行括号内的语句,打印“成年”。

②上述代码是一个单分支案例,只提供了一种选择,满足条件(即年龄大于18),则‘{ }’内的语句被执行,打印“成年”;如果不满足(即年龄小于18),则程序不会有任何输出结果
[运行结果]

②双分支

>语法格式

if(条件表达式)
{
	语句1;
}  
else
{
	语句2;
}

>Code Ⅱ

int main()
{
	int age = 20;
    if(age>=18)
    {
    	printf("可以进网吧");
    }
    else
    {
    	printf("不能进网吧");
    }
    return 0;
}

[解析]

①双分支提供了两种选择,条件表达式产生的结果为真时(表达式结果非0,即满足条件),程序会执行语句1,语句2不会被执行;当条件表达式禅城的结果为假时,程序会执行语句2,语句1不会被执行

②要注意的是,双分支结构下,如果用户输入无误,程序最终的输出结果一定是二选一。

[运行结果]

③多分支

>语法格式

if(条件表达式)
    执行1;
else if(条件表达式)
    执行2;
...
else
    执行n;

>Code Ⅲ

int main()
{
	int age = 20;
    if(age < 18)
    {
    	printf("未成年\\n");
    }
    else if(age >= 18 && age < 30)
    {
    	printf("青年\\n");
    }
    else if(age >= 30 && age<50)
    {
    	printf("中年\\n");
    }
    else
    {
    	printf("老年\\n");
    }
    return 0;
}

[解析]

①多分支提供了多种选择,则会产生多种判断,如上述代码中,程序由上往下运行,先判断年龄是否小于18,满足则打印未成年;如果不满足,则继续判断是否在18~30之间,如果不满足则继续进行下一个判断,以此类推

②如果所有条件都不满足,则会执行最后一条语句

③多分支结构下如果用户输入无误,则一定会有一条语句执行

[运行结果]

二、关于if语句的注意事项

①条件表达式的书写规则

在判断年龄是否在两个数之间时,一定要用 '&&' 连接,不能以数学思维写成连续的判断式,如if(18<=age<30){},否则程序会产生预期之外的结果

>Code Ⅰ

int main()
{
	int age = 15;
    if(18 <= age < 30)
    {
    	printf("青年\\n");
    }
}

[运行结果]

[解析]

按照期望的结果,年龄15时小于18的,此时程序应该不输出结果;而由运行结果可以看到,程序打印了分支结构中的语句,其原因在于:

①计算机在做条件判断时是不会以人类现实中的数学思维进行连续的等式判断的

②在上述代码中的判断式中,程序的执行过程为

(1)判断表达式[18<=15],表达式产生结果0(表示假)

(2)判断表达式[0<30],表达式产生结果非0(表示真)

则此时,整个条件表达式最终产生的结果为真,程序认为条件满足,则执行分支结构中的语句,打印结果

②大括号 '{ }' 的使用

当if、else if或者else后面只有一条语句时,可以不加大括号;不加大括号时,if、else if、else只能控制其后的一条语句

>Code Ⅱ

int main()
{
    int a = 1;
	if(a == 2)
    	printf("Hello\\n");
    	printf("World");	
}

[运行结果]

[解析]

因为if只能管理其下的一条语句,上述代码中,条件表达式不满足,此时不打印"Hello",但第二条语句printf("World\\n");是不受if控制的,所以无论条件表达式是否满足,其都会打印。

③悬空else(else的匹配机制)

int main()
{
	int a = 0;
    int b = 2;
    if(a==1)
        if(b == 2)
            printf("hello\\n");
    else
        printf("world\\n");
}

//加上'{}'后的代码逻辑更加清晰易读
int main()
{
	int a = 0;
    int b = 2;
    if(a==1)
    {
        if(b == 2)
        {
        	printf("hello\\n");
        }  
    	else
        {
            printf("world\\n");	
        }
    }
}

[运行结果]

[解析]

①上述代码中,如果只根据缩进对齐的情况来看,很容易认为第8行的else和第5行的if匹配,从而得出程序的运行结果为打印“world”

②实际上else语句只会匹配最近的if组成一个分支结构,即上述代码中,else其实匹配的是6行的if,与其组成一个完整的双分支结构;而该双分支结构整体实际上是第5行if下的一个执行语句。

③在写代码,即使时if、else后只有一条语句,也最好加上 '{ }',从而使代码更加容易阅读理解


Part 3 switch语句

一、switch的用法

在用if语句来实现多分支情况时,如果面临的分支较多,则会出现代码冗余的问题,如下代码:

int main()
{
	int day = 0;
    scanf("%d",&day);
    if(day == 1)
    {
    	printf("星期一\\n");
    }
    else if(day == 2)
    {
   		printf("星期二\\n");
    }
    else if(day == 3)
    {
    	printf("星期三\\n");
    }
    else if(day == 4)
    {
    	printf("星期四\\n");
    }
    else if(day == 5)
    {
    	printf("星期五\\n");
	}
    else if(day == 6)
    {
    	printf("星期六\\n");
    }
    else 
    {
    	printf("星期日\\n");
    }
}

从代码可以看到,用if语句实现多分支,会出现代码所占篇幅长,看起来比较多余重复的感觉

由此C语言引入switch语句,从而更简洁的实现多分支问题

>Code Ⅰ:初见switch语句

int main()
{
	int day = 0;
    scanf("%d",&day);
    switch(day)
    {
        case 1:
            printf("星期一");
            break;
        case 2:
            printf("星期二");
            break;
        case 3:
            printf("星期三");
            break;
        case 4:
            printf("星期四");
            break;
        case 5:
            printf("星期五");
            break;
        case 6:
            printf("星期六");
            break;
        case 7:
            printf("星期日");
            break;
    }
}

[运行结果]

二、switch语法拆解

switch(整型表达式)
{
    case [整型常量表达式]:
    {
    	语句;
        break;
    }
    default:
    {
    	语句;
    }
}

①基础语法解释

switch语句在使用时强调整型,即switch后括号内的表达式和case后的表达式必须为整型,且case后的表达式必须为整型常量;程序运行时,switch后括号内整型表达式的值会与switch语句内的每个一case进行匹配,当整型表达式的值和case后的整型常量表达式的值相等时,匹配成功,执行该case下的语句

②关于break

break在switch语句中起到“分割”的作用,是可选项,需要根据需求判断是否需要为当前case加上break;当switch内的一个case匹配成功后,程序便会从该case下的语句开始,一直往后执行其他case下的语句,直到程序读到break为止或程序走出switch语句的代码块

用下面的代码帮助理解:

>Code Ⅰ:case后不加break

int main()
{
	int i = 0;
    scanf("%d",&i);
    switch(i)
    {
        case 1:
            printf("我");
        case 2:
            printf("爱");
        case 3:
            printf("C语言");
    }
    return 0;
}

当输入1时,swich语句中的case1会被匹配,执行case1下的代码以及case1后面所有case下的代码,直到出现break或程序走出switch语句;上述代码中每个case后都没有break,所以每个case下的语句都会被输出

当输入2时,case2会被匹配,则程序从case2的语句开始执行,直到出switch语句,case1下的语句不会被执行。

[运行结果_输入1]

[运行结果_输入2]

>Code Ⅱ:case1下加break

int main()
{
	int i = 0;
    scanf("%d",&i);
    switch(i)
    {
        case 1:
            printf("我");
            break;
        case 2:
            printf("爱");
        case 3:
            printf("C语言");
    }
    return 0;
}

switch语句内,程序遇到break便不会再往后执行其他case下的语句;所以上述代码中,当输入为1时,由于case1下有break,所以程序执行case1下的语句后,遇到break跳出swtich语句

[运行结果]

③default在swtich是可选项,用于应对没有case可以正确匹配的情况下(如用户输入有误),提供默认的输出结果,给予用户反馈

>Code Ⅲ

int main()
{
	int i = 0;
    scanf("%d",&i);
    switch(i)
    {
        case 1:
            printf("我");
        case 2:
            printf("爱");
        case 3:
            printf("C语言");
        default:
            printf("您的输入有误");
    }
    return 0;
}

[运行结果]

④swtich语句在书写时,养成在最后一个case下加上break的习惯;以及swtich语句内不强调顺序,所以default的位置可以任意,所以default后也要记得加上break防止代码出现逻辑错误

三、练习

①根据用户输入打印结果:打印1~5时,打印工作日;打印6~7时,打印工作日;其他输入打印输入有误

int main()
{
	int day = 0;
    scanf("%d",&day);
    switch(day)
    {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        printf("工作日");
        break;
    case 6:
    case 7:
        printf("休息日");
        break;
    default:
        printf("输入有误");
    }
    return 0;
}

②阅读代码,判断程序运行结果

int main()
{
	int m = 2;
	int n = 1;
	switch (n)
	{
	case 1:
		m++;
	case 2:
		n++;
	case 3:
		switch (n)
		{
		case 1:
			n++;
		case 2:
			m++;
			n++;
			break;
		}
	case 4:
		m++;
		break;
	default:
		break;
	}
	printf("m = %d, n = %d\\n", m, n);
	
	return 0;
}

[解析]

m=2;n=1

程序运行过程:

①匹配case1,执行case1下的语句:

m++; ----> m=3

②case1没有break,执行case2下的语句:

n++; ----> n=2

③case2没有break,执行case3下的语句,case3下的语句是一个嵌套的switch语句

此时n=2,嵌套的switch语句中,匹配case2,执行case2下语句

m++; ----> m=4

n++; ----> n = 3

④遇到break,跳出嵌套的switch,而外层switch语句内的case3下没有break,则继续执行case4下的语句

m++; ----> m=5

⑤遇到break跳出switch,打印结果"m = 5, n = 3"

[运行结果]

以上是关于分支(选择)语句的主要内容,如果未能解决你的问题,请参考以下文章

2.1 shell语句

if语句基本介绍(小白必看!!!)

if语句基本介绍(小白必看!!!)

流程控制——判断,选择,循环。

逻辑分支

shell 编码语句