C语言-分支结构

一、if-else

1.单分支

  语法:

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

  执行流程:

  条件表达式为真(值不为 0 )时,就执行语句块。

在这里插入图片描述

2.双分支

  语法:

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

  执行流程:

  1.首先判断条件表达式看其结果是为真(值不为 0 )还是假(值为 0)
  2.如果是真,就执行语句块 1
  3.如果是假,就执行语句块 2

在这里插入图片描述

3.多重分支

  语法:

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

  执行流程:

  1.首先判断条件表达式 1 看其结果是真(值不为 0 )还是假(值为 0)
  2.如果是真,就执行语句块 1,然后结束当前多分支
  3.如果是假,就继续判断条件表达式 2,看其结果是真还是假
  4.如果是真,就执行语句块 2,然后结束当前多分支
  5.如果是假,就继续判断条件表达式 … 看其结果是真还是假
  …
  n. 如果没有任何关系表达式为真,就执行语句块 n+1,然后结束当前多分支。

在这里插入图片描述

4.拓展

  当条件表达式之间是“互斥”关系时(即彼此没有交集),条件判断语句及执行语句间顺序无所谓。
  例如:当 type=1 时输出香蕉,当 type=2 时输出苹果,当 type=3 时输出梨子,则下列两种写法的顺序都是可以的

// 写法 1
if(type == 1) 
{
	printf("香蕉");
}
else if(type == 2)
{
	printf("香蕉");
}
else 
{
	printf("梨子");
}

// 写法 2
if(type == 3) 
{
	printf("梨子");
}
else if(type == 2)
{
	printf("香蕉");
}
else 
{
	printf("香蕉");
}

  当条件表达式之间是“包含”关系时,“小上大下 / 子上父下”,否则范围小的条件表达式将不可能被执行。
  例如:成绩在 [0, 59] 之间为不合格,成绩在 [60, 79] 时为合格,成绩在 [80, 100] 时为优秀
  让我们来分析一下第二种的错误写法,因为成绩但凡大于等于 80 的则一定也会大于等于 60,所以只要成绩大于等于 60 则就没有机会进行是否大于等于 80 的判断了,故这是错误的写法。

// 正确写法
if(score >= 80)
{
	printf("优秀");
}
else if(score >=60)
{
	printf("合格");
}
else
{
	printf("不合格");
}

// 错误写法
if(score >= 60)
{
	printf("合格");
}
else if(score >=80)
{
	printf("优秀");
}
else
{
	printf("不合格");
}

  当 if-else 结构是“多选一”时,最后的else是可选的,根据需要可以省略

// 正确写法
if(score >= 80)
{
	printf("优秀");
}
else if(score >=60)
{
	printf("合格");
}
else if(score >=0)
{
	printf("不合格");
}

  语句块只有一条执行语句时,一对{}可以省略,但建议保留

// 正确写法
if(score >= 80)	printf("优秀");
else if(score >=60)	printf("合格");
else printf("不合格");

  如果有多个 if 和 else ,没有 {} 的情况下, else 总是跟最接近的 if 匹配。为了提供代码的可读性,建议使用大括号,明确 else 匹配哪一个 if 。

5.判断是否是闰年

  编写一个程序,判定某个年份是否为闰年。年份满足如下条件之一,即是闰年:
  (1) year 是 400 的整数倍: year%400==0
  (2) 能被4整除,但不能被100整除:year % 4 == 0 && year % 100 != 0

#include<stdio.h>

int main() {
	int year;
    printf("输入年份: ");
    scanf("%d", &year);
    if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
        printf("%d 是闰年\n", year);
    else
        printf("%d 不是闰年\n", year);
    
    return 0;
}

二、switch-case

1.基本语法

  switch 语句用于判断条件有多个常量结果的情况。效率高一点点。

switch(表达式){
	case 常量值1: 
        语句块1;
        //break;
	case 常量值2: 
        语句块2;
        //break;
	┇ ┇
	case 常量值n: 
        语句块n; 
        //break;
	[default: 
        语句块n+1;
    ]
}

2.执行过程

  第1步:根据 switch 中表达式的值,依次匹配各个 case。如果表达式的值等于某个 case 中的常量值,则执行对应 case 中的执行语句。
  第2步:执行完此 case 的执行语句以后,

  • 情况1:如果遇到 break,则执行 break 并跳出当前的 switch-case 结构
  • 情况2:如果没有遇到 break,则会继续执行当前 case 之后的其它 case 中的执行语句。—>case穿透
  • 直到遇到 break 关键字或执行完所有的 case 及 default 的执行语句,跳出当前的 switch-case 结构

    在这里插入图片描述

3.拓展

  1.case 子句中的值必须是常量,不能是变量名或不确定的表达式值或范围。
  2.同一个 switch 语句,所有 case 子句中的常量值互不相同
  3.如果没有 break,程序会顺序执行到 switch 结尾;一般 switch-case 结构中都要编写 break。
  4.default 子句是可选的。同时,位置也是灵活的。当没有匹配的 case 时,执行 default 语句。
  5.在 C 语言中,switch 语句中的 case 标签后的代码块不需要使用大括号 {} 来括起来,即使这个代码块有多条语句。这是因为 switch 语句在C语言中是基于语句的,而不是基于表达式的。
  6.switch 后面的表达式不能是浮点型,=只能是整型和字符型

4.实例

  使用 switch-case 实现:对学生成绩大于 60 分的,输出“合格”。低于 60 分的,输出“不合格”。

  最简单写法:

int main() {
    int score = 83;

    //方式1:
    switch(score / 10){
        case 0:
            printf("不及格");
            break;
        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;
        case 8:
            printf("及格");
            break;
        case 9:
            printf("及格");
            break;
        case 10:
            printf("及格");
            break;
        default:
            printf("成绩输入有误");
            break;
    }
    return 0;
}

  进一步优化(多个 case 分支对应同样的语句体):

int main() {
    int score = 83;

    //方式2:体会case穿透
    switch(score / 10){
        case 0:
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("不及格");
            break;
        case 6:
        case 7:
        case 8:
        case 9:
        case 10:
            printf("及格");
            break;
        default:
            printf("成绩输入有误");
            break;
    }

    return 0;
}

  终极优化:

int main() {
    int score = 83;

    //方式3:算法层面优化
    switch(score / 60){
        case 0:
            printf("不及格");
            break;
        case 1:
            printf("及格");
            break;
        default:
            printf("成绩输入有误");
            break;
    }

    return 0;
}

  错误写法:

int main() {

    int key = 10;
    switch (key) {
        case key > 0 :  //提示:Expression is not an integer constant expression
            printf("正数");
            break;
        case key < 0:
            printf("负数");
            break;
        default:
            printf("零");
            break;
    }

    return 0;
}

四、if-else与switch-case比较

凡是使用switch-case的结构都可以转换为if-else结构。反之,不成立。
如果既可以使用switch-case,又可以使用if-else,建议使用switch-case。因为效率稍高。

1.if-else语句优势

  1.if 语句的条件可以用于范围的判断,也可以用于等值的判断,使用范围更广
  2.switch 语句的条件是一个常量值,只能判断某个变量或表达式的结果是否等于某个常量值,使用场景较狭窄

2.switch语句优势

  1.当条件是判断某个变量或表达式是否等于某个固定的常量值时,使用 if 和 switch 都可以,习惯上使用 switch 更多。因为效率稍高。当条件是区间范围的判断时,只能使用 if 语句。
  2.使用 switch 可以利用穿透性,同时执行多个分支,而 if…else 没有穿透性。

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值