分支和循环

目录

1. 引言:你是否了解C语言?

2. if语句

2.1 语法形式

2.2 执行流程

​编辑

2.3 代码示例

2.4 if...else...语句

2.4.1 语法形式

2.4.2 执行流程

2.4.3 代码示例

2.5 分支中包含多条语句

2.6 嵌套if

2.7 悬空else问题

3. switch语句

3.1 语法形式

3.2 if语句和switch语句的对⽐

1. 使用if语句完成

2. 使⽤switch语句完成

3.3 switch语句中的break

3.4 switch语句中的default

3.5 switch语句中的case和default的顺序问题

4. while循环

4.1 语法形式

4.2 执行流程

4.3 代码示例

5. for循环

  5.1 语法形式

5.2 执行流程

5.3 代码示例

6. do-while循环

6.1 语法形式

6.2 执行流程

6.3 代码示例

7. break语句和continue语句

7.1 while循环中的break和continue

7.1.1 break举例

7.1.2 continue举例

7.2 for循环中的break和continue

7.2.1 break举例

7.2.2 continue举例

7.3 do while循环中的break和continue

7.3.1 break举例

7.3.2 continue举例

8. 结言

1. 引言:你是否了解C语言?

C语⾔是 结构化 的程序设计语⾔,这⾥的结构指的是 顺序结构 选择结构 循环结构 ,C语⾔是能
够实现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分为这三种结构或者
这三种结构的组合。  
我们可以使⽤ if switch 实现分⽀( 选择 )结构,使⽤ for while do while 实现循环结构。

前面的文章中提到了if---else语句,其属于分支和循环的知识,为了更好的理解分支和循环,下面逐一介绍这几个语句。

2. if语句

2.1 语法形式

if ( 表达式 )//表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏。
{
 语句
}

注意:C语言中,0为假,非0为真。

表达式的结果如果是0,则语句不执⾏,表达式的结果如果不是0,则语句执⾏。

2.2 执行流程

2.3 代码示例

//输⼊⼀个整数,判断是否为奇数
#include
int main()
{
	int num = 0;
	printf("请输入一个整数:");
	scanf("%d", &num);
	if (num % 2 == 1) 
//表达式成⽴(为真),即num为奇数,语句执⾏。
//表达式不成⽴(为假),即num为偶数,语句不执⾏。
	{
		printf("%d 是奇数\n", num);//语句
	}
	return 0;
}

一个数如果不是奇数,那么就是偶数,果任意⼀个整数,我们要清楚的判断是奇数还是偶数该怎么表示呢?

这⾥就需要 if...else... 语句了,下面我们对其展开介绍:

2.4 if...else...语句

2.4.1 语法形式

if(表达式)//表达式成⽴(为真),则语句1执⾏。
{
   语句1
}
else//表达式不成⽴(为假),则语句2执⾏。
{
   语句2
}

2.4.2 执行流程

即在if语句流程上变化,表达式为0时,执行else下的语句,然后结束。

2.4.3 代码示例

#include
int main()
{
	int num = 0;
	printf("请输入一个整数:");
	scanf("%d", &num);
	if (num % 2 == 1)
	{
		printf("%d 是奇数\n", num);
	}
	else
	{
		printf("%d 是偶数\n", num);
	}
	return 0;
}

2.5 分支中包含多条语句

注意:默认在 if else 语句中,它们都只控制⼀条语句。

代码示例

#include 
int main()
{
	int age = 0;
	printf("请输入年龄:");
	while (scanf("%d", &age) == 1)
	{
		if (age >= 18)
			printf("成年了\n");
		    printf("可以谈恋爱了\n");
	}
	return 0;
}

上面代码运行结果为:

上面的运行结果:无论年龄是否大于等于18岁,“可以谈恋爱了”都会数输出,但小于18岁只会输出“可以谈恋爱了”,而不会输出“成年了”。

由此可以看出:printf("成年了\n")语句是受if语句控制的,而printf("可以谈恋爱了\n")语句不受if语句控制。即if语句只控制一条语句。

下面加上else:

#include 
int main()
{
	int age = 0;
	printf("请输入年龄:");
	while (scanf("%d", &age) == 1)
	{
		if (age >= 18)
			printf("成年了\n");
		else
			printf("未成年\n");
		    printf("不可以谈恋爱\n");
	}
	return 0;
}

上面代码运行结果为:

天理难容啊,未成年不可以谈恋爱也就算了,成年了竟然也也不可以。

由此可见,else语句也只能控制一条语句。

那么如何让它们控制多条语句呢?使用{}就可以实现了。

#include 
int main()
{
	int age = 0;
	printf("请输入年龄:");
	while (scanf("%d", &age) == 1)
	{
		if (age >= 18)
		{
			printf("成年了\n");
			printf("可以谈恋爱了\n");
		}
		else
		{
			printf("未成年\n");
			printf("不可以谈恋爱\n");
		}
	}
	return 0;
}

运行结果为:

这样就完美了。

2.6 嵌套if

if --else 语句中, else 可以与另⼀个 if 语句连⽤,构成多重判断。
代码示例:
//一个整数要么是0,要么是正数,要么是负数。
#include 
int main()
{
 int num = 0;
 scanf("%d", &num);
 if(num == 0)
 printf("输⼊的数字是0\n");
 else if(num > 0) //这⾥的if 相当于嵌套在els语句中,形成了嵌套结构
 printf("输⼊的数字是正数\n");
 else
 printf("输⼊的数字是负数\n");
 return 0;
}

与前面的代码结合一下

//先判断是否为正数,如果是,再判断是奇数还是偶数,并输出;如果不是,则输出非正数。
#include 
int main()
{
	int num = 0;
	printf("请输入一个整数:");
	scanf("%d", &num);
	if (num > 0)//正数
	{
		if (num % 2 == 0)
			printf("偶数\n");
		else
			printf("奇数\n");
	}
	else//非正数
	{
		printf("⾮正数\n");
	}
	return 0;
}

2.7 悬空else问题

注意:如果有多个 if else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。

代码示例:

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

运行结果为:啥都不输出

为什么呢?

这就是悬空 else 的问题, 如果有多个 if 和 else ,可以记住这样⼀条规则, else 总是跟最接近
的 if 匹配。
上⾯的代码排版,让 else 和第⼀个 if 语句对⻬,让我们以为 else 是和第⼀个if匹配的,当 if
语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印 haha ,但实际上 else 是和第⼆个 if
进⾏匹配的, 这样后边的 if...else 语句是嵌套在第⼀个 if 语句中的 ,如果第⼀个 if 语句就不
成⽴,嵌套 if else 就没机会执⾏了,最终啥都不打印。
为了更容易理解,我们将上面的代码改一下:
#include 
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	{
		if (b == 2)
			printf("hehe\n");
		else
			printf("haha\n");
	}
	return 0;
}

另外若想else与第一个if匹配,修改一下代码就可以实现。

#include 
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)//a!=1,故表达式a==1为假,不执行下{}里的语句。
	{
		if (b == 2)
			printf("hehe\n");
	}
	else//语句执行,输出haha。
	{
		printf("haha\n");
	}
	return 0;
}

而且代码更具有逻辑性,更加清晰,这是{}的功劳。只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以⼤家以后在写代码的时候要注意括号的使⽤,让代码的可读性更⾼。

下面介绍实现分支结构的另一个语句switch语句:

3. switch语句

switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况。它把多重
的 else if 改成更易⽤、可读性更好的形式。

3.1 语法形式

switch (expression) 
{
 case value1: statement
 case value2: statement
 default: statement
}
上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,
就执⾏ default 分⽀。
注意:
• switch 后的 expression 必须是整型表达式
• case 后的值,必须是整形常量表达式

3.2 if语句和switch语句的对⽐

下面通过一个练习题,进行if语句和switch语句的对比:

练习题:输⼊任意⼀个整数值,计算除3之后的余数。

1. 使用if语句完成

#include 
int main()
{
	int n = 0;
	printf("请输入一个整数:\n");
	scanf("%d", &n);
	if (n % 3 == 0)
		printf("整除,余数为0\n");
	else if (n % 3 == 1)
		printf("余数是1\n");
	else
		printf("余数是2\n");
	return 0;
}

2. 使⽤switch语句完成

#include 
int main()
{
	int n = 0;
	printf("请输入一个整数:\n");
	while (scanf("%d", &n) == 1)
	{
		switch (n % 3)
		{
		case 0:
			printf("整除,余数为0\n");
			break;
		case 1:
			printf("余数是1\n");
			break;
		case 2:
			printf("余数是2\n");
			break;
		}
	}
	return 0;
}
上述的代码中,我们要注意的点有:
1. case 和后边的数字之间必须有 空格
2. 每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。

运行结果:

使用不同的语句实现相同的功能,可见C语言的魅力。

上面代码中出现了break与default,下面我们展开介绍:

3.3 switch语句中的break

break既然在switch语句中出现了,就一定有它的作用,如果把其去掉,会出现什么情况呢?

下面我们来观察一下:

​
#include 
int main()
{
	int n = 0;
	printf("请输入一个整数:\n");
	while (scanf("%d", &n) == 1)
	{
		switch (n % 3)
		{
		case 0:
			printf("整除,余数为0\n");
		case 1:
			printf("余数是1\n");
		case 2:
			printf("余数是2\n");
		}
	}
	return 0;
}

运行结果:

输入整数1,应该输出余数是1,却还输出了余数是2;输入整数2,输出正确;输入整数3,应该输出整除,余数是0,却还输出了余数是1,余数时2。

基于上面的情况,我们调整一下case的语序,观察不同:

#include 
int main()
{
	int n = 0;
	printf("请输入一个整数:\n");
	while (scanf("%d", &n) == 1)
	{
		switch (n % 3)
		{
		case 1:
			printf("余数是1\n");
		case 2:
			printf("余数是2\n");
		case 0:
			printf("整除,余数为0\n");
		}
	}
	return 0;
}

运行结果:

可以观察到结果明显不同。

这是为什么呢?
原因是 switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch
句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执⾏,有可能执⾏其他 case
语句中的代码,直到遇到 break 语句或者 switch 语句结束。
  所以在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。
当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。
下面通过一道题来说明一下:
练习题: 输⼊⼀个1~7的数字,打印对应的星期⼏
#include 
int main()
{
	int day = 0;
	while (scanf("%d", &day) == 1)
	{
		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;
		}
	}
	return 0;
}

运行结果:

当题目改变:
输⼊1-5,输出的是“⼯作⽇”;
输⼊6-7,输出“休息⽇”。
可以将代码中的”星期一“”星期二“”星期三“”星期四“”星期五”改为“ ⼯作⽇”,”星期六“”星期天“改为 “休息⽇”。
但这样需要改很多,我们可以采用简便的代码:
#include 
int main()
{
	int day = 0;
	while (scanf("%d", &day) == 1)
	{
		switch (day)
		{
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			   printf("工作日\n");
			   break;
		case 6:
		case 7:
			   printf("休息日\n");
			   break;
		}
	}
	return 0;
}

运行结果:

这样break就省去了一些,代码更加简洁。
另外使用了break后,即使case语句语序不一样,输出结果也是一样的,如果不相信,可以自己去实践一下。
上⾯的练习中,我们发现应该根据实际的情况,来在代码中觉得是否使⽤ break ,或者在哪⾥使⽤
break ,才能正确完成实际的需求。
那么有一个疑问:让 输⼊⼀个1~7的数字,我偏不,我就输入8,输入9,运行结果会是什么呢?
运行结果:
分支和循环_第1张图片
分支和循环_第2张图片
可以观察到什么也没有输出。
注意:这里为了更好的观察运行结果,将多组输入改为了单个输入
如果想要让其输出“输入错误,请重新输入”,该怎么办?
这就需要引入default语句,下面我们具体展开介绍:

3.4 switch语句中的default

在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹
配代码中的 case 语句的时候(如上述8,9的情况),这时候要不就不做处理,要不就得在switch 语句中加⼊ default 语句。
加入default语句后代码为:
#include 
int main()
{
	int day = 0;
	while (scanf("%d", &day) == 1)
	{
		switch (day)
		{
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			printf("工作日\n");
			break;
		case 6:
		case 7:
			printf("休息日\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	}
	return 0;
}

运行结果:

介绍了break和default后,下面介绍:

3.5 switch语句中的case和default的顺序问题

switch 语句中 case 语句 句和 default 语 句有要求顺序吗? default 只能放在最后吗?
其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实
际需求的就可以。 (如上面的代码,可以调整case语句和default语句的顺序,但需 整体调序 。)
不过我们通常是把 default 语句 句放在最后处理的。
上面介绍了分支结构,下面介绍循环结构:

4. while循环

C语⾔提供了3种循环语句, while 就是其中⼀种,接下来就介绍⼀下 while 语句。

4.1 语法形式

while 语句的语法形式和 if 语句⾮常相似:
while(表达式)//表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏。
{
      语句;
}

4.2 执行流程

4.3 代码示例

//在屏幕上打印 1~10 的值
#include 
int main()
{
	int i = 1;//定义变量i,并初始化为1。
	while (i <= 10)
	//i小于等于10,表达式成立,为真,语句执行,先打印i的值,再对i的值加1;i大于10,表达式不成立,为假,语句不执行。
	{
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}
运行结果:
介绍了while循环,下面介绍for循环:

5. for循环

for 循环是三种循环中使⽤最多的,为什么呢?
下面展开介绍,相信你看完后就明白了。

  5.1 语法形式

for(表达式1; 表达式2; 表达式3)
//表达式1 ⽤于循环变量的初始化
//表达式2 ⽤于循环结束条件的判断
//表达式3 ⽤于循环变量的调整
{
   语句;
}
for循环把初始化,判断,调整三个部分放在一起。

5.2 执行流程

⾸先执⾏ 表达式 1 初始化循环变量,接下来就是执⾏ 表达式 2 的判断部分, 表达式 2 的结果如果
==0,则循环结束; 表达式 2 的结果如果!=0则执⾏循环语句,循环语句执⾏完后,再去执⾏表 达式3 ,调整循环变量,然后再去 表达式 2 的地⽅执⾏判断, 表达式 2 的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循环。

5.3 代码示例

//在屏幕上打印 1~10 的值
int main()
 {
	 int i = 0;
     //   初始化  判断     调整
	 for (i = 1; i <= 10; i++)

	 {
		 printf("%d ", i);
     }
		 return 0;
}

和上面的代码对比一下:

for while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部
分⾮常集中,便于代码的维护,⽽如果代码较多的时候 while 循环的三个部分就⽐较分散,所以从形式上 for 循环要更优⼀些,故而使用的比较多。

运行结果:

介绍了while循环后,下面介绍do-while循环:

6. do-while循环

在循环语句中 do while 语句的使⽤最少,它的语法如下:

6.1 语法形式

do
{
 语句;
}while(表达式);

6.2 执行流程

do while 循环中先执⾏图上的“语句”,执⾏完语句,在去执⾏“判断表达式”,判断表达式的
结果是!=0,则继续循环,执⾏循环语句;判断表达式的结果==0,则循环结束。
所以在 do while 语句中循环体是⾄少执⾏⼀次的,这是 do while 循环⽐较特殊的地⽅。

6.3 代码示例

//在屏幕上打印1~10的值
#include 
int main()
{
	int i = 1;
	do
	{
		printf("%d ", i);
		i = i + 1;
	} while (i <= 10);

	return 0;
}

运行结果:

为什么do-while语句使用最少?

原因是:⼀般 do while 使⽤在循环体⾄少被执⾏⼀次的场景下,所以较少⼀些。

下面通过一个练习题,来实现这种场景:

练习题:输⼊⼀个正整数,计算这个整数是⼏位数。

例如:

输⼊:1234 输出:4
输⼊:12 输出:2
#include 
int main()
{
	int n = 0;
	scanf("%d", &n);
	int cnt = 0;
	do
	{
		cnt++;
		n = n / 10;
	} while (n);
	printf("%d\n", cnt);	
    return 0;
}
这⾥并⾮必须使⽤ do while 语句,但是这个代码就⽐较适合使⽤ do while 循环,因为n即使是
0,也是1位数,要统计位数的。
上面介绍了循环的三种语句,细心看,就会发现它们的执行流程中都有break语句和continue语句,在介绍switch语句时也提到了break语句,下面具体展开介绍它们在循环中的作用。

7. break语句和continue语句

在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中提供了 break continue 两个关键字,就是应该到循环中的。
break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执
⾏。
continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所
差异的。

7.1 while循环中的break和continue

7.1.1 break举例

#include 
 int main()
{
	 int i = 1;
	 while (i <= 10)
	{
		if (i == 5)
			 break;//当i等于5后,就执⾏break,循环就终⽌了
	    printf("%d ", i);
		i = i + 1;
	}//继续往后执行
	 return 0;
	 }

运行结果:

打印了1,2,3,4后,当i等于5的时候,循环在 break 的地⽅终⽌,不再打印,不再循环。
所以 break 的作⽤就是永久的终⽌循环,只要 break 被执⾏, break 外的第⼀层循环就终⽌了
那以后我们在循环中,想在某种条件下 终⽌循环 ,则可以使⽤ break 来完成我们想要的效果。

7.1.2 continue举例

#include 
int main()
{
	 int i = 1;
	 while (i <= 10)
	{
	   if (i == 5)
		  continue;
	//当i等于5后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅
	//因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊死循环
	   printf("%d ", i);
	   i = i + 1;
	}
	 return 0;
}

运行结果:

因程序陷入死循环,打印1,2,3,4 后,程序继续运行,不结束,故输出结果为图片所示。

continue 是继续的意思,在循环中的作⽤就是跳过本次循环中 continue 后边的代码,继续进⾏
下⼀次循环的判断。
到这⾥我们就能分析出来, continue 可以帮助我们跳过某⼀次循环 continue 后边的代码, 直接
到循环的判断部分, 进⾏下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成死循环。

7.2 for循环中的break和continue

7.2.1 break举例

#include 
 int main()
{
	 int i = 1;
	 for (i = 1; i <= 10; i++)
		 {
		 if (i == 5)
			 break;
		 printf("%d ", i);
		 }
	 return 0;
 }

运行结果:

其实和 while 循环中的 break ⼀样, for 循环中的 break 也是⽤于终⽌循环的,不管循环还需
要循环多少次,只要执⾏到了 break ,循环就彻底终⽌。

7.2.2 continue举例

#include 
 int main()
{
	 int i = 1;
	 for (i = 1; i <= 10; i++)
		 {
		 if (i == 5)
			 continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
		 printf("%d ", i);
		 }
	 return 0;
}

上面的代码跳过了5的打印。

运行结果:

for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码, 直接去到循环的调
整部分。

7.3 do while循环中的break和continue

7.3.1 break举例

#include 
int main()
{
	int i = 1;
	do
	{
		if (i == 5)
			break;
		printf("%d ", i);
		i = i + 1;
	} while (i <= 10);
	return 0;
}

运行结果:

7.3.2 continue举例

#include 
int main()
{
	int i = 1;
	do
	{
		if (i == 5)
			continue;
		printf("%d ", i);
		i = i + 1;
	} while (i <= 10);
	return 0;
}

运行结果:

分支和循环_第3张图片do.while 语句中的 break continue 的作⽤和 while 循环中⼏乎⼀模⼀样。

8. 结言

本篇文章介绍了分支与循环的相关知识,篇幅较长,可以根据目录分部去看,希望对大家 学习C语言有所帮助,也希望大家多多支持,后续会带来更多创作(下一篇文章会运用循环的嵌套来进行牛刀小试-找出素数并打印)。

你可能感兴趣的:(C语言知识,c语言)