分支与循环

本文详细介绍了C++中的分支语句(if...else,switch)、循环语句(for,while,do-while),以及它们的使用场景、改进和区别。重点讨论了循环中的break和continue,以及goto语句的用法和限制。
摘要由CSDN通过智能技术生成

目录

一。分支语句

if...else语句

 举个例子:判断输入的年龄,如果在1到18岁之间输出不可谈恋爱,否则就输出可以谈恋爱。

悬空的else

switch语句

switch判断一个数是奇数还是偶数

用switch来写星期一到星期五为学习,星期六到星期天表示休息

那我们既然有了if语句那为什么还要有switch语句?

二。循环语句

for循环语句

 打印1~100之间9的个数

 for循环搭配break

for循环搭配continue

while循环     ​编辑

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

while搭配break   

while搭配continue   

for循环和while的差别

do-while

输入一个大于等于0的整数,计算这个数有几位

 do while搭配break 

 do while搭配continue

do while 和 while 的区别

接下来我介绍下goto语句


一。分支语句

分支语句包含if语句和switch语句

if...else语句

int main()
{
	if (表达式)
	{
		语句1;
	}
	else
	{
		语句2;
	}
	return 0;
}

表达式结果为真(非0)那就执行语句1,否则执行语句2。

 举个例子:判断输入的年龄,如果在1到18岁之间输出不可谈恋爱,否则就输出可以谈恋爱。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int age = 0;
	printf("请输入你的年龄:");
	scanf("%d", &age);
	if (0 < age < 18)
	{
		printf("不可以谈恋爱\n");
	}
	else
	{
		printf("可以谈恋爱\n");
	}
	return 0;
}

运行结果:

     

 好奇怪为什么我输入了20明明大于了18却不能谈恋爱?

原因是:你输入的20首先跟0相比较,20肯定是大于0的(为真)返回1,然后1在和18相比较,18肯定是大于1的所以表达式结果为1,就执行了语句1。所以我们发现我们不管输入什么值都是执行语句1,那这不就完犊子了?所以有没有可以改进的地方?

   改进:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int age = 0;
	printf("请输入你的年龄:");
	scanf("%d", &age);
	if (0 < age  && age < 18)
	{
		printf("不可以谈恋爱\n");
	}
	else
	{
		printf("可以谈恋爱\n");
	}
	return 0;
}

&&运算符表示两侧为真才为真,如果左侧为假就不会判断右侧的了,因为有一个为假整体全都为假。但是如果左侧为真的话那还是要在判断右侧的表达式。所以我们此时在输入20 ==> (0 < 20 && 20 < 18) ,0小于20为真返回1,20小于18为假返回0,所以整体为0执行语句2。

悬空的else

#include <stdio.h>

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

一般的第一次看到这个代码的读者肯定是想着输出的是haha,但是很遗憾的是这个代码什么都不会输出。

原因是:写这个代码的人故意把else和第一个if对齐导致我们以为的是如果a不等于1那就执行haha,但其实else总是跟最接近的 if 匹配,也就是说这边的else是与b等于2这个if进行匹配的。我们加上大括号来看。

#include <stdio.h>

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

这么一看就能看出如果a不等于1的话那么下面的语句都不会执行。那我们可不可以就让else和a等于1进行匹配? 

#include <stdio.h>

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

switch语句

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

注意:1.switch后面的expression一定要是整形表达式。

           2.case 后的值必须是整形常量表达式。           

switch判断一个数是奇数还是偶数

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int input = 0;
	scanf("%d", &input);
	switch (input % 2)
	{
	case 0:
		printf("偶数\n");
		break;
	case 1:
		printf("奇数\n");
		break;
	}
	return 0;
}
  • 注意:case 和后面的数字直接必须要有空格,因为case是关键字。
  • 每⼀个 case 语句中的代码执行完成后需要加上 break 才能跳出这个switch语句。
  • break也并不是每个case语句执行完都要加break,具体还是要看需求。  

用switch来写星期一到星期五为学习,星期六到星期天表示休息

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int day = 0;
	scanf("%d", &day);
	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;
}

如果我们在1和5之间都写入共同的语句(休息日)和break虽然也可以但是代码却冗余了 。

default表示如果你输入的数字不是1到7之间那么就执行default后面的语句,这有点像if语句中的else。

那我们既然有了if语句那为什么还要有switch语句?

 switch 是多分支选择语句,而 if 语句只有两个分支可供选择。虽然可以用嵌套的 if 语句来实现多分支选择,但那样的程序冗长难读。但是switch也有局限性那就是对判断条件很严苛,case后面只能跟整形常量,有些时候如果漏写了break很有可能会导致程序出现bug,if语句相对来说就比较灵活,而且如果判断条件较少的话,使用if语句更好。

二。循环语句

for循环语句

for (表达式1; 表达式2; 表达式3)
  • 表达式1:表示初始化,只会执行一次 
  • 表达式2:条件判断,为真执行语句 
  • 表达式3:变量调整

 for循环执行流程图 

 打印1~100之间9的个数

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

// 9,19,29,39,49,59,69,79,89,90,91,92,93,94,95,96,97,98,99
int main()
{
	int i = 0;
	int count = 0;//统计9的个数
	for (i = 1; i <= 100; i++)
	{
		if (i % 10 == 9)
		{
			count++;
		}
		if (i / 10 == 9)
		{
			count++;
		}
	}
	printf("1到100中9个个数:%d\n", count);//20个
	return 0;
}

 for循环搭配break

#include <stdio.h>

int main()
{

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

运行结果:

   

 我们可以看到当i等于5时执行了break就退了for循环,所以break作用是终止循环不在执行循环体的内容,如果有嵌套循环就转到使用了break循环外的语句。

for循环搭配continue

#include <stdio.h>

int main()
{

	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
		{
			continue;
		}
		printf("%d ", i);
	}
}

运行结果 

     

我们可以看到这里并没有打印5,是因为当i等于5时执行continue就没有执行后面的输出语句,而是执行了表达式3(i++),所以continue的作用是结束本次循环,进行下一次循环,而不终止整个循环的执行。

  • 接下来我要介绍while循环语句。
  • 这里注意体会for循环和while的差别

while循环     

首先就是判断表达式是否为真,表达式的值为0表示假,就不进入循环语句中。表达式的值非0表示真,就执行循环体语句的内容,执行完成再次来到判断表达式中,循环反复直到表达式为假就跳出循环。 

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

#include <stdio.h>

int main()
{
	int input = 0;
	scanf("%d", &input);
	while (input)
	{
		printf("%d ", input % 10);//得到个位数
		input /= 10;//去掉个位数
	}
	return 0;
}

运行结果:

 

while搭配break   

#include <stdio.h>

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

  运行结果:       

        

 有此我们可以看出来档i等于5时就执行了break语句,直接结束了while循环。     

while搭配continue   

#include <stdio.h>

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

  运行结果 :

        

此时白色光标一直在4后面闪烁,因为这个代码死循环了。因为我们把i++这个调整语句放在了continue下面,也就是说当i等于5的时候就执continue(不执行下面的语句直接跳转到判断表达式中),因为i等于5是小于10的所以表达式为真,执行循环语句,但由于i一直是5所以if语句总为真,这就一直执行continue导致i++没有机会得到执行,循环反复这个循环就一直停不下来。

for循环和while的差别

 因为for循环的初始化,判断语句,调整部分是写在一块的所以维护起来是十分方便的。  while循环:如果代码量比较多,那么while循环的初始化,判断语句,调整部分就会比较分散,不利于代码的维护,所以一般情况下使用for循环跟多

  • 接下来我要介绍do-while循环语句 
  •  这里注意体会while循环和do-while的区别

do-while

do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执行 while 后的判断表达式,表
达式为真,就会进行下⼀次,表达式为假,则不再继续循环。

输入一个大于等于0的整数,计算这个数有几位

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

int main()
{
	int n = 0;
	int sum = 0;
	scanf("%d", &n);
	int k = n;
	do
	{
		sum++;
		n /= 10;
	} while (n);
	printf("%d有%d位\n", k, sum);
	return 0;
}

运行结果:

  这里可以看出来do-while是先执行完语句才判断表达式,所以输入0也算1位 

 do while搭配break 

#include <stdio.h>

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

这里因为是先输出,所以输出结果是1 2 3 4 5,由于n等于5时执行了break所以退出了循环

 do while搭配continue

#include <stdio.h>

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

运行结果是:  

   

因为我们是先输出,所以i等于5的时候就执行了continue跳转到表达式判断中,这就导致了i++一直没机会执行,所以就一直输出5形成了死循环 

do while 和 while 的区别

  1. do while 是先执行一次语句在判断表达式,要是表达式为假就退出,为真就继续循环,至少执行一次。 
  2. while 先判断表达式,为假就退出循环,为真就执行循环体的内容。
  • 接下来我介绍下goto语句

goto语句是一个分支语句,有类似循环的作用,goto语句搭配跳转标号可以实现在同一个函数内跳转到设置好的标号处。

#include <stdio.h>

int main()
{
	printf("haha\n");
	goto xh;
	printf("xixi\n");
xh:
	printf("hehe\n");
	return 0;
}

运行结果:   

        

 我们可以看到当语句执行到goto的时候就跳转到设置好的标记处然后再执行标记处下的代码

 goto语句也称为无条件转移语句,所以不建议使用goto语句,因为它会打乱程序的正常执行流程使程序的控制流难以跟踪,使程序难以理解和难以修改,但goto语句也不是一无是处,比如如果是在多层嵌套语句中,要想一下子退出多层循环就可以使用goto。

for (...)
{
	for (...)
	{
		for (...)
		{
			if (disaster)
				goto error;
		}
	}
}
error:
//...
本来 for 循环想提前退出得使用 break ,一个 break 只能跳出一层 for 循环,如果3层循环嵌套就得使用3个break 才能跳出循环,所以在这种情况下我们使用  goto 语句就会更加的快捷
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值