分支语句与循环语句

C语言是结构化的程序设计语言,有顺序结构、分支结构、循环结构。

一.什么是语句

C语句可分为以下五类:
1. 表达式语句 
2. 函数调用语句
3. 控制语句
4. 复合语句
5. 空语句(一个分号)

二.分支语句(选择语句)

什么是选择语句?

如果你好好学习,毕业就能找到好工作
如果你不学习,毕业你就失业了。

 逻辑图如下

1.1 if语句

①语法结构

//1 单分支
if(表达式)//  当表达式为真,语句执行
    语句;


//2   双分支
if(表达式)  到表达式为真,语句1执行;否则执行语句2
   语句1;
else
   语句2;


//3.多分支
if(表达式1)
   语句1; 
else if(表达式2)  //表达式1为真,执行语句1;表达式1为假,表达式2为真,语句2执行;表达式1为 
                      假,表达式2也为假,语句3执行。
    语句2
else
    语句3; 

//C语言中规定,0就是假,非0为真。

例子:

 //注:默认情况下if语句后面只能跟一条语句,当if语句后面需要跟多条语句时,可以用大括号”{ }“  (代码块)将所有语句括起来。

 

 1.2 悬空else

当我们写了如下的代码时,输出的结果是hehe还是haha呢?

#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;
}

输出结果为  空白

 原因是,else只匹配距离它最近的if,所以 else 与if(b=2)是一对,因此输出结果啥也没有。当我们写if语句时,用代码块将每一层语句都括起来,使得代码逻辑清晰。

2. switch语句

2.1常常用于多分支情况。

比如:

输入1,输出星期一
输入2,输出星期二
输入3,输出星期三
输入4,输出星期四
输入5,输出星期五
输入6,输出星期六
输入7,输出星期日

如果用if ,else if ,else的形式写代码会很麻烦,如果我们用switch语句就会简单很多。

int main()
{
	int day = 0;
	scanf("%d", &day);
	//if (1 == day)
	//	printf("星期一");
	//else if (2==day)
	//	printf("星期二");
	//else if .....
	//....
	return 0;
}

switch语句语法结构

switch(整型表达式)
{
  语句项;
}

语句项是一些case语句

case 整形常量表达式:
  语句;

2.2在switch语句中的 break语句。

当我们用运行下列代码时,输入数字1,我们想要的结果是星期1,但是所有星期的天数都会打印出来。

原因是switch语句在执行时,如果代码只存在单纯的case语句,当我们输入1时,实行完case1内部的语句后,会自动执行下一个case语句的内容,直到走完整个switch语句。如果我们要实现switch语句的分支,需要搭配break。

 ②当我们把每周划分为工作日和周末,有以下代码

 输入12345时,将打印出工作日;输入67时,打印出周末。

所以,break语句的实际效果是把语句列表划分为不同的分支部分。

再写switch语句时,我们尽量在case语句后面加上break语句。

2.3 default子句

        当表达的值与所有case标签的值都不匹配的时候,程序不会终止 ,也不会报错,在C语言中并不认为这种情况是个错误,结果只是所有的语句都被跳过而已。例:

        如果如果你并不想忽略不匹配所有标签的表达式的值,你可以在语句列表中增加一条default子句(default:)。

         当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。所以,每个switch语句中只能出现一条default子句

但是它可以出现在语句列表的任何位置(可以理解为switch语句先执行case子句,当所有case子句都不匹配时,才会执行default子句,与代码顺序无关),而且语句流会像执行一个case标签一样执行default子句。

//1	
int main()
{
	int a = 3;

	switch (a)
	{
	default:
		break;
	case 1:
		printf("haha\n");
		//default:
	   //	break;
	case 2:
		printf("hehe\n");
		//default:
		//	break;
	case 3:
		printf("xixi\n");
		//default:
		//	break;
	case 4:
			printf("oooo\n");
	//default:
	//	break;
	}


	return 0;
}

//不管default子句在switch语句内部的哪一行,输出结果都一样。

//在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。

3.循环语句  while    for    do while、

 循环:同一件事情我们需要完成很多次

流程图

 

3.1whlie循环

语法结构

while(表达式)
循环语句;

 例子:打印1~10.

 定义变量a=1,判断a<=10后进入while循环,先打印a,然后a自增;然后再次判断自增后的a与10比较大小,直到表达式为假循环结束。

3.1.2while语句中的break和continue

①break

当我们在1~10这几个数字中按顺序打印时,规定只能打印出1~4 这4个数,打印出4之后后面的循环终止,这种情况下我们可以 使用break来终止while循环,只需要多加一行判断代码,判断数字是否大于等于5,然后用break终止循环。例:

        //break在while循环中的作用:在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。

  

②continue

那如果还是上述代码,将break换成continue,会发生什么呢?例:

 

 我们发现,当打印出4之后,编译器既没有打印出其他东西,也没有停止。原因是:当a=5时,执行了continue,而continue的作用是:用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

所以在这段代码中,a=5一直在循环,陷入了死循环

3.2 for循环

语法结构

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

表达式1为初始化部分,用于初始化循环变量的;

表达式2为条件判断部分,用于判断循环时候终止;

表达式3为调整部分,用于循环条件的调整。

流程图

 

对比一下for循环和while循环

int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
printf("hehe\n");
i = i+1;//调整部分
}


for(i=1; i<=10; i++)
{
printf("hehe\n");
}

我们可以发现在while循环中存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。

3.2.2for循环中的break和continue

for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。
但是还是有些差异。例子:

 在a=5的时候,continue与会终止本次循环,但是仍会执行表达式3(a++),使得a继续自增,a!=5那么循环继续正常进行,直到a>10。这种情况下for循环不会进入死循环,这是与while循环的区别。

特别建议:

1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

  

 

 

 

3.3 do while 

3.3.1语法结构

do
循环语句;
while(表达式);

3.3.2 执行流程

 

3.3.3特点

循环至少执行一次

 定义变量 i=10,创建do while循环,定义while的表达式  i<10。我们发现输出结果打印了一次10;说明do while循环进行了一次。

3.3.4do while 循环中的break和continue

①break:和while、for循环一样当代码执行了break,循环终止。

②continue:跳过本次循环,执行下一次循环。例:

 这段代码打印了除5之外的9个数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值