分支和循环

一、分支语句

分支语句有:if  else   和    switch  case

1、if else语句

分支语句也叫选择语句,程序先进入if进行判断,结果为真,

执行if{}内的语句,结果为假,则执行else{}内的语句。举例:

(1)单分支选择结构:

//判断一个数是否为奇数

int main()
{
	int a = 7;
  if(a%2 = 1)
	{
  	printf(“奇数”);
	}
	else
	{
  	printf(“偶数”);
	}
	return 0;
}

程序创建变量a = 7;然后程序进入ifelse语句进行判断,首先进入if语句,如果a%2=1的话,()内的结果就为真(非零),就执行printf(“奇数”);如果a%2!=1的话,()内的结果就为假(零),就执行printf(“偶数”);

{}内部的叫程序块。

(2)多分支选择结构:

//判断一个人的成绩是ABC哪个层次

int main()
{
    int num = 0;
    scanf(“%d”, &num);
    if(num>=90 && num <=100)
		{
      printf(“优秀A”);
		}
		else if(“num>=60&& num <90”)
		{
      printf(“良好B”);
		}
		else
		{
      printf(“不及格C”);
		}
		return 0;
}

同上述程序一样,输入一个学生的成绩,判断成绩是否在90~100之间,如果是就输出优秀A,如果成绩在60~90之间的话,就输出良好B,如果成绩在60分以下,就输出不及格C。

else if可以有多个。

(3)悬空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;
}

这里面的else就是悬空else,一般情况下我们会认为,这个else是和第一个if是组合在一起的,但是实际上是和第二个if组合在一起的。这里起到个误导的作用。

分支和循环_for循环

同样的一段代码,放在编译器中,这样看是不是就不会有歧义了。所以我们要避免悬空else这样的代码风格。


2、switch语句

switch语句也是分支结构通常用于多分支结构。

它的代码样式是这样的:

switch(常量表达式)
{
      语句项;
}

语句项的代码样式如下:

语句项:case(常量表达式) 
{
		语句;
}

两者结合在一起,如下:

switch(常量表达式)
{
      case 1:
            语句;
      case 2:
            语句;
      。。。。。。
      default;
      			语句;
}

程序会根据switch的常量表达式的值到语句项中寻找对应的case n,如果有就执行对应的case n,没有就执行default语句。

switch语句中有一个default关键字,default,是switch语句中的默认选项,是当没有case n能让switch执行的时候,才执行它,也可能是case 1 ~case n之间没有跳出循环,语句一直执行下去的时候,也会执行default。

switch语句中的 break

在switch语句中,我们没法直接实现分支,搭配break使用才能实现真正的分支。

switch(常量表达式)
{
      case 1:
            语句;
            break;
      case 2:
            语句;
            break;
      。。。。。。
      default;
      			语句;
            break;
}

break,是跳出循环的关键字,它的作用是跳出当前循环,不再执行当前循环中的语句了。switch语句的话,通常用在每个case n语句后面,这样可以让我们得到想要的结果。


//输入一个数,输出星期几

分支和循环_for循环_02

这里就用break实现了switch语句的分支结构。如果没有break的话就会变成:

分支和循环_switch语句_03

输入一天,这天既是星期二又是星期三。。。,这就不对了。

例:输入月份显示这个月有多少天。(不考虑平年闰年)

分支和循环_switch语句_04

这样写既可以判断月份又可以减少代码量让代码看起来更简洁。



二、循环语句

1、while循环

while循环的特点是初始化,判断条件,调整语句三个是分开的。

int i = 0;//声明i变量的同时,初始化i变量
while(i <10)//循环的判断条件
{
	循环体语句;
	i++;//i的调整语句
}

例:使用while循环输出1-10之间的数字。

分支和循环_switch语句_05

在while循环中还可以使用关键字break或continue让程序跳整个循环体或跳过本次循环。

break 和 continue 是两个跳出循环的关键字,但是他俩的作用不同,break是跳出当前循环体,不再执行循环中的语句,而continue是跳过本次循环,回到循环的判断条件去判断结果为真后继续进入循环执行语句。

如:

分支和循环_for循环_06

因为进入循环体后,当i=5时,执行break语句,程序直接跳出循环,还没有打印呢就直接跳出来了,所以结果是1,2,3,4

而如果是continue呢?

分支和循环_while循环_07

输出框中我们并没有看到程序执行结束的标志,说明此时的程序在进行循环,但是有没有打印,所以是陷入了死循环。因为,当i=5时,进入if语句执行continue语句。程序会回到循环判断条件处进行下一次判断,但是i一直都是5,i的值没有发生变化,所以i只要进入循环体就会回到循环判断条件,如此循环往复。

例:设计一个功能实现只输出数字

分支和循环_for循环_08


2、for循环

for循环的特点是把初始化、循环判断、语句调整放在了一起,这样让程序看起来更简洁,修改也更方便。

int i = 0;//声明变量i
for(i=0; i<10; i++)//这里就将三者放在了一起
{
		循环体语句;
}

分支和循环_for循环_09

实现的效果是一样的,但是这样写看着要比while循环更简洁。

同样的,break和continue也适合for循环。

分支和循环_while循环_10

与上述while循环中break一样都是因为,i=5,而进入if语句执行break后直接跳出整个循环体了。

分支和循环_while循环_11

但是为什么for循环中的continue实现的效果和while循环中的不一样呢?

因为,for循环判断条件和语句是有先后执行顺序的:

分支和循环_while循环_12

先执行(1),在for循环中(1)只执行一次,然后执行的就是(2),(3),(4),执行一圈下来后再执行(2),(3),(4),循环往复知道(2)的条件不满足。所以,当i=5时,continue回到判断条件去,就去执行了i++,这时i变成了6,6<=10,进入循环体,之后就可以正常运行了。所以打印1-10中间没有5。

关于for使用时的建议:

      1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。

2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。


3、do while循环

do while循环的特点是,先执行一遍循环体,再去判断。

int i = 0;声明i变量的同时,初始化i变量
do
{
	循环体语句;
	i++;
}while(i<10)

分支和循环_for循环_13

do while循环的运行顺序是:先初始化变量i,接下来不是进入循环判断而是先执行do{}内部的语句,执行完成后再进入while中判断。

同样的break和continue也适用于do while循环。