C语言中的分支和循环(上)

一、前言

一、前言
我们知道,C语言是一门结构化的程序设计语言,他支持三种结构:

顺序结构
选择结构:if 、switch
循环结构: for、 while、 do while

其实,不止是C语言,我们生活中遇到的事情也往往是由着三种结构所组成的。今天,让我们来了解C语言中的选择结构。

二、if语句

2.1、什么是选择结构

首先什么是选择结构,下面我们来看一张图:
在这里插入图片描述
其实C语言中的选择结构与现实中的选择也是类似的,下面是C语言中if语句的执行流程:
在这里插入图片描述

2.2、if语句语法形式

if语句的语法形式如下:

1  if ( 表达式 )
2      语句

if语句的表达形式非常简单
表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行
在C语言中,0为假,非0表示真(负数也表示真)
即表达式的结果是0,语句不执行,表达式的结果不是0,表达式执行

例子:输入一个0到100的分数,判断是否及格

# include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a >= 60)
		printf("恭喜你,及格了!");
	return 0;
}

2.3、if…else…语句

如果所给的分数他没有及格,那他就是不及格了(怎么感觉在讲废话),那我们怎么清楚地知道他有没有及格呢?
这就需要我们的 if…else… 语句了

在C语言中,else 是一个可选的关键字,用于在 if 语句中添加条件不满足时执行的代码块。当 if 语句中的条件为假时,程序会跳过if代码块中的内容,然后执行 else 代码块中的内容。

语法形式如下:

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

接着上面的例子:

int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a >= 60)
		printf("恭喜你,及格了!/n");
	else
		printf("好好好,没及格是吧,等着重修吧");
	return 0;
}

2.4、分支中包含多条语句

下面我们先来看一个例子:

int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a >= 60)
		printf("恭喜你!/n");
	    printf("及格了!/n")return 0;
}

让我们看看代码的运行结果:
在这里插入图片描述
在这里插入图片描述
我们发现,无论打印的数字是否>=60,屏幕都会打印 “及格了!”,这是为什么呢?
原来,在C语言中默认 if 和 else 语句都只控制一条语句,就算上下两个“printf”对齐了也无济于事。
如果想让 if 控制多条语句,那我们需要用 “{}” 将他们括起来,同理 else 也是如此。

下面是这段代码的正确写法:

int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a >= 60)
	{
		printf("恭喜你!\n");
		printf("及格了!");
	}
	else
	{
		printf("好好好,没及格是吧\n");
		printf("等着重修吧!\n");
	}
	return 0;
}

2.5、嵌套if

在C语言中多个 “if…else…” 可以连用,构成多重选择。

例如:要求输入一个分数,判断不及格、及格、优秀。

# include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a < 60)
	{
		printf("好好好,没及格是吧!\n");
		printf("等着重修吧!\n");
	}
	else
	{
		if (a < 85)
		{
			printf("恭喜你!\n");
			printf("及格了!\n");
		}
		else
			printf("哥,别卷了\n");
	}
	return 0;
}

该代码有一个更简便的写法,将非必要的 “{}” 去掉,即 “else if” 语句。

# include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a < 60)
	{
		printf("好好好,没及格是吧!\n");
		printf("等着重修吧!\n");
	}
	else if(a < 85)
	{
		printf("恭喜你!\n");
		printf("及格了!\n");
    }
	else
		printf("哥,别卷了\n");
	
	return 0;
}

接着,我们来看一段错误的代码:

int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a < 60)
	{
		printf("不及格!\n");
	}
	if (a < 85)
	{
		printf("及格了!\n");
	}
	else
	{
		printf("优秀!\n");
	}
	return 0;
}

当输入59时,运行结果如下:
在这里插入图片描述
好家伙,到底是及格还是不及格呢,这是怎么回事呢
这是因为这个代码的第二个判断语句用的是 if 而不是 else if

if 是会独立执行的,条件满足及格 if 语句就执行几个 if 语句
else if 语句,当前面的 if 语句被执行后,将不再执行

2.6、悬空else问题

如果有多个 if 和 else ,可以记住这样一条规则, else 总是跟最近的 if 相匹配

下面我们看一段代码:

int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("good\n");
	else
		printf("oh no\n");
	return 0;
}

代码的运行结果是啥?
很多同学以为:a是0,那就执行 else 子语句,即打印“oh no”
但输出结果是:啥都不输出

为什么呢

因为 else 总是跟着最近的 if 匹配,即使 else 对齐的是第一个 if 也无济于事

但我们反过来想,如果 else 对齐的是第二个 if,是不是一目了然呢,可见好的代码风格无比重要
如果想让代码正确实现,在一个 if 后面加上大括号,将子语句括起来就行啦,这样即使 else 有天大的本事,那也只能对应第一个 if

小贴士:
上述" if (b == 2)" 可以写成" if (2 == b)"
因为初学着很容易将“赋值 =”与“等于 ==”记错,他们在语法上没有任何错误,这样写的话当想要实现“等于”而不小心写成“赋值”的话系统就会报错来提示你

三、switch语句

当我们的选择情况非常多时,用else if语句就会显得非常繁琐,这时我们就可以使用switch语句。它用于判断条件有多个结果的情况,把多重的 else if 改成更易用,可读性更好的形式。

3.1、switch语句语法形式

switch (expression)
{
case value1: statement
case value2: statement
default: statement
}

上面代码中,根据表达式expression的不同值,执行相应的 case 分支,如果找不到对应的值。就执行 default 分支

注:
1、 switch 后面的 expression 必须是整型表达式
2、 case 后面的值,必须是整型常量表达式
3、 case 必须加 “空格” 后才能接后面的值
4、 casedefault 后面接的是 “:” 而不是 “;”
5、 switch 语句中的 “default” 并没有顺序要求,只要你的顺序是满足实际需求就可以

3.2、switch语句中的break

首先我们先看一段代码:

int main()
{
	char a = 0;
	scanf("%c", &a);
	switch (a)
	{
	case 'A':
		printf("优秀\n");
	case 'B':
		printf("良好\n");
	case 'C':
		printf("合格\n");
	default:
		printf("不合格\n");
	}
	return 0;
}

如果我们输入“A”,结果是什么呢?

在这里插入图片描述
怪事怪事,怎么全都打印出来呢,不应值打印优秀吗

其实,switch 语句中, case 只负责从哪里进入,而从哪里出,则由 break 掌管

如果某一个 case 语句的后面没有 break 语句,代码会继续往下执行,有可能执行其他的 case 语句中的代码,知道遇到 break 或者 switch 语句结束。

正确代码:

int main()
{
	char a = 0;
	scanf("%c", &a);
	switch (a)
	{
	case 'A':
		printf("优秀\n");
		break;
	case 'B':
		printf("良好\n");
		break;
	case 'C':
		printf("合格\n");
		break;
	default:
		printf("不合格\n");
		break;
	}
	return 0;
}

好啦,本期分支语句就介绍到这里啦,希望本期博客能对你有所帮助,同时,如果有错误的地方请多多指正,让我们在C语言的学习路上一起进步!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值