C语言的分支与循环

本文详细介绍了C语言中的分支结构(if、else、嵌套if和switch)、循环结构(while、for、dowhile),以及break、continue和goto语句的使用,帮助初学者理解基本的程序控制流程。
摘要由CSDN通过智能技术生成

C语言是结构化的程序设计语言 ,这里的结构化指的是顺序结构、选择结构、循环结构,我们日常 生活里的事情都可以拆分为这三种结构;

我们可以使用if、switch实现分支结构,使用for、while、do while实现 循环结构。

一.分支结构

1.1 if语句

if语句的格式如下

if (表达式)
    语句

当表达式为真(成立 ),就执行语句;反之则不执行

在c语言中,“0”表示假,非零表示为真,也就是如果表达式的结果为零,则语句不执行;如果表达式的结果不为零,则语句执行。

1.2 else语句

else语句的格式如下

if (表达式)
    语句;
else
    语句;

else语句总是和if语句连用(有 else就有if,有if不一定有else)

else语句考虑的是if语句其他的情况,比如if判断的是奇数,那么else判断的就是偶数

练习:输入一个数,判断它是奇数还是偶数

#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a % 2 == 1)
		printf("是奇数");
	else
		printf("是偶数");
	return 0;
}
1.3 多分支情况

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

#include <sdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a > 1)
		printf("hehe\n");
	    printf("haha\n");
	
}

不论输入的a是否大于1,都会打印haha

这是因为 printf("haha\n");  不受if管理,是一个单独的语句,想解决这个问题只需要用{}把两条语句括起来就行:

#include <stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	if (a > 1)
	{
		printf("hehe\n");
		printf("haha\n");
	}
}

想要if或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");
	else if (num > 0)
		printf("输入的数字是正数");
	else
		printf("输入的数字是负数");
	return  0;
}

有了嵌套if,我们就可以实现更多复杂的运算

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("haha");

	else
		printf("hehe");
	return 0;
}

如果你的答案是打印hehe,那你就掉进陷阱了,其实结果是啥都不输出

 这就是悬空else的问题,如果有多个if和else,记住else总是和最近的if匹配。由于上面的排版,导致else看起来是和第一个if匹配的,实际上是和第二个if匹配,如果将代码改成下面的格式就更容易理解了

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

如果我们确实希望else和第一个if匹配,那我们可以这样改

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

只要使用适当的大括号,就可以帮我们解决很多问题,让代码可读性更高

2.1 switch语句 

switch语句是一种特殊的if...else 语句,用来判断条件有多个结果的情况。

格式如下:

switch (表达式) {
case value1:
	语句;
case value2:
	语句;
default :
	语句;
}

根据表达式不同的值,执行相应的case语句,没有就执行default语句

注意:

1.Switch 后面的表达式必须是整型

2.case 后面的值必须是整型常量表达式

3.case 和后面的数字之间必须有空格

2.2 if语句和switch语句对比

练习:输入一个整数值,计算除3之后的余数

如果使用if语句:

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

如果使用switch语句:

#include <stdio.h>

int main()
{
	int num = 0;
	scanf("%d", &num);
	switch (num % 3 ) 
	{
	 case 1:
		printf("余数是1");
		break;
	 case 2:
		printf("余数是2");
		break;

	 case 0:
		printf("余数是0");
		break;

	}
	return 0;
}

不知你们发现没有,每一个case语句后面都有一个break;接下来我们就来介绍switch 中的break·

2.3 switch中的break

之前的代码中,如果我们去除break 会是什么情况呢:

#include <stdio.h>

int main()
{
	int num = 0;
	scanf("%d", &num);
	switch (num % 3 ) 
	{
	 case 1:
		printf("余数是1");
	 case 2:
		printf("余数是2");
	 case 0:
		printf("余数是0");
	}
	return 0;
}

运行结果:

 我们发现,4除以3余数本来是1,但运行结果却出现了余数为2和0

这是为什么呢?

原因是switch语句也是分支语句,只有通过break;才能跳出switch语句 ,如果一个case语句后面没有break,代码会继续往下执行有可能会执行其他case语句中的代码,直到遇到break或者switch语句结束,所以switch中的case语句是非常重要的,当然,也不是每一个case语句都需要break,得根据实际情况来判断

2.4 switch中的default

在使用switch语句时,会遇到一种情况,switch后的表达式中的值无法匹配case中的语句时要么就不处理,要么就加上一个default语句.

switch (表达式) {
case value1:
	语句;
case value2:
	语句;
default :
	语句;
}

switch中的表达式结果不是value1,也不是value2时,就会执行default语句.

2.5 switch中case和default的顺序问题

在switch语句中,case和default是没有顺序要求的,不过我们通常把default放在最后

二.循环结构

1.1 while循环

while语句的格式如下:

while(表达式)
  语句;
1.2 while循环的实践

练习:在屏幕上打印1-10的值

#include <stdio.h>

int main()
{
	int i = 0;
	while (i <= 10)
	{
		printf("%d ", i);
	    i++;
	}

	return 0;
}

 练习:输入一个正整数,逆序打印这个整数的每一位

列如:

输入:1234  输出:4 3 2 1

输入:521 输出:1 2 5

题目解析:

1.要想求每一位,用n % 10就行

2.去掉n的最低位,用n /= 10就行

3.循环1和2两步,就能得到所有位

参考代码:
 

#include <stdio.h>

int main()
{
	int n = 0;
	scanf("%d", &n);
	while (n)
	{
		printf("%d ", n % 10);
		n /= 10;
	}
	return 0;
}
2.1 for循环

  for循环是所有循环里用得最多的,格式如下::

for (表达式1;表达式2;表达式3)
     语句;

表达式1 用于项目初始化

表达式2 用于循环结束条件的判断

表达式3 用于循环变量的调整

执行顺序:表达式1->表达式2->语句->表达式3

练习:在屏幕上打印1-10

#include <stdio.h>
int main()
{
	for (int i = 0; i <= 10; i++)
	{
		printf("%d ", i);
	}
	return 0;
}

 2.2 while循环和for循环的对比

for循环的初始化,判断,调整比较集中,便于代码的维护

while循环适合代码较多的时候

3.1 do while循环

语句结构如下:

do
 语句;

while(表达式);

do while语句的循环体至少执行一次,这是其比较特殊的地方

练习:输入一个正整数,判断这个数是几位数

列如:
输入:1234 输出:4

输入:12 输出:2

参考代码:

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int count = 0;
	do
	{
		n /= 10;
		count++;
	} while (n);
	printf("%d", count);
	return 0;
}
4. break和continue
4.1 while循环中的break和continue

break举例

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

 执行结果

 break的作用就是永久的终止循环,只要break被执行,break外的一层循环就会结束

continue举例

如果把上面的break替换为continue会是什么结果呢?
 

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

运行结果

 当i=5后,就执行continue,跳过continue的代码,因为跳过了i = i+1,所以i一直为5,陷入了死循环。

4.2 for循环中的break和continue

break举例:
 

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

 continue举例:

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

未来当某个条件发生时,本次循环无需再执行后续某些操作时,就可以使用continue来实现。

4.3 do while循环中的break和continue

do while循环中的break和continue和while循环中的break和continue几乎一模一样

5. 循环的嵌套

练习:

找出100-200之间的素数,打印在屏幕上

注:素数又称质数,只能被1和其本身整除

解析:
1.要从100-200之间找出素数,首先得有100-200之间的数,可以用循环产生

2.要判断i是否是素数,要拿2~i-1之间的数字去试除i,需要产生2~1-1之间的数字,也可以使用循环解决

参考代码:

#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++)
	{
		int j = 0;
		int flag = 1;
		for (j = 2; j < i; j++)
		{
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
			if (flag == 1)
				printf("%d ", i);
		
	}
	return 0;
}
6.go to语句

go to语句可以实现在同一个函数内跳转到设置好的标号处

例如:
 

#include <stdio.h>
int main()
{
	printf("heeh\n");
	goto next;
	printf("sjd\n");

next:
	printf("hahah\n");
	return 0;
}

goto语句如果使用不当,就会导致在函数内部随意乱跳转,打乱程序的执行,但goto语句并不是一无是处,在多层循环中使用goto就非常方便了

for (...)
{
	for (...)
	{
		for (...)
		{
			for (...)
			{
				if (disaster)
					goto error;
			}
		}
	}
	error:
}

 如果使用break跳出循环,那么就需要3个break,这种情况下使用goto语句就会更快一些

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值