分支和循环
一、分支语句
分支语句有: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组合在一起的。这里起到个误导的作用。
同样的一段代码,放在编译器中,这样看是不是就不会有歧义了。所以我们要避免悬空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语句后面,这样可以让我们得到想要的结果。
//输入一个数,输出星期几
这里就用break实现了switch语句的分支结构。如果没有break的话就会变成:
输入一天,这天既是星期二又是星期三。。。,这就不对了。
例:输入月份显示这个月有多少天。(不考虑平年闰年)
这样写既可以判断月份又可以减少代码量让代码看起来更简洁。
二、循环语句
1、while循环
while循环的特点是初始化,判断条件,调整语句三个是分开的。
int i = 0;//声明i变量的同时,初始化i变量
while(i <10)//循环的判断条件
{
循环体语句;
i++;//i的调整语句
}
例:使用while循环输出1-10之间的数字。
在while循环中还可以使用关键字break或continue让程序跳整个循环体或跳过本次循环。
break 和 continue 是两个跳出循环的关键字,但是他俩的作用不同,break是跳出当前循环体,不再执行循环中的语句,而continue是跳过本次循环,回到循环的判断条件去,判断结果为真后继续进入循环执行语句。
如:
因为进入循环体后,当i=5时,执行break语句,程序直接跳出循环,还没有打印呢就直接跳出来了,所以结果是1,2,3,4
而如果是continue呢?
输出框中我们并没有看到程序执行结束的标志,说明此时的程序在进行循环,但是有没有打印,所以是陷入了死循环。因为,当i=5时,进入if语句执行continue语句。程序会回到循环判断条件处进行下一次判断,但是i一直都是5,i的值没有发生变化,所以i只要进入循环体就会回到循环判断条件,如此循环往复。
例:设计一个功能实现只输出数字
2、for循环
for循环的特点是把初始化、循环判断、语句调整放在了一起,这样让程序看起来更简洁,修改也更方便。
int i = 0;//声明变量i
for(i=0; i<10; i++)//这里就将三者放在了一起
{
循环体语句;
}
实现的效果是一样的,但是这样写看着要比while循环更简洁。
同样的,break和continue也适合for循环。
与上述while循环中break一样都是因为,i=5,而进入if语句执行break后直接跳出整个循环体了。
但是为什么for循环中的continue实现的效果和while循环中的不一样呢?
因为,for循环判断条件和语句是有先后执行顺序的:
先执行(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)
do while循环的运行顺序是:先初始化变量i,接下来不是进入循环判断而是先执行do{}内部的语句,执行完成后再进入while中判断。
同样的break和continue也适用于do while循环。