2. 分支语句
什么是分支语句?
分支语句就是选择结构,人生无时无刻不在做选择,程序一样,程序也需要做选择。所以分支语句简单来说,就是给程序做选择,决定程序走哪条路的语句
2.1 if 语句
if 语句是C语言中常见的分支语句,它有三种形式,单分支,双分支,以及多分支。
2.1.1 单分支
单分支,简单来说,就是判断,是否走这条路
从学校出发,你可以选择直接回家,也可以选择先去商店买东西,再回家。这就是一个单分支,用代码演示为
#include <stdio.h>
int main() {
char c = 'm'; //创建一个变量
if (c == 'm') //如果 c == m时,代表我想买东西
printf("买东西");//那么就走进这条路,先买东西,再回家
printf("回家");
return 0;
}
如果c 的值,不满足条件,那么就意味着 不想走这条路,不想买东西,直接回家!
2.1.2 双分支
那么问题来了,我们只能选择一条路吗? 当然不是,人生怎么可能只有一种选择,程序也一样,所以这里就要用到双分支了,也就是 if … else 语句,意思就是如果…否则。
这里我们换个例子,因为字符无法更好的理解
就拿考试这个例子,如果及格,那么就没事,如果不及格,那么回家就得挨打。代码演示效果如下。
#include <stdio.h>
int main() {
int score = 65; //定义一个变量,用来表示分数
if (score >= 60)
printf("安然无恙\n"); // 如果分数大于 60 ,则安然无恙
else
printf("回家挨打"); // 否则就回家挨打
return 0;
}
分数大于等于 60 分的代码运行结果
不满足条件(也就是分数小于60)的运行结果
2.1.3 多分支
那么我们的考试中只有及格和不及格吗?那我能不能再给考试成绩分个级别呢? 例如90分以上为优秀80-90为良好,60-80为一般,60以下为不及格。
答案是当然可以,这里就要运用到我们的多分支了
从这张图中,我们就可以清晰的看到,无论你的分数是多少,你都只能符合其中的一个条件,意思就是只能走一条路!虽然有四条路,但你只能走一条路。而分数则是 你走哪条路的条件,所以就要用到 else if(条件),就是当前面的条件不满足时,再给一个新的条件,如果满足则可以执行这个条件的代码。 用代码演示如下
#include <stdio.h>
int main() {
int score = 95; //定义一个变量,用来表示分数
if (score >= 90)
printf("优秀\n"); // 如果分数大于等于90 ,优秀
else if(score>=80) // 如果分数大于等于80(且小于90) ,则良好
printf("良好\n");
else if (score >= 60) // 分数大于等于60,则一般
printf("良好\n");
else
printf("不及格\n"); // 以上三种都不满足的时候,那肯定就是不及格了
return 0;
}
代码运行结果如下:
优秀
良好:
不及格:
这时候就有疑问了。例如 95分,它同时满足优秀,良好,一般,三个条件。
为什么只打印优秀呢? 这个前面已经说过了,它只能走一条路!虽然有四条路,但是只能走一条路。 最先符合条件的路,先走了,那就不会再走后面的路。 它的第一个判断是 判断分数是否大于90,如果这个条件满足了,那么下面的else if 就不会再继续判断,因为一个if 语句只能走一条路。
还有重要的一点,就是else 它只对应最近离它最近的if语句。
#include <stdio.h>
int main() {
int a = 1;
if (a == 2)
if (a == 1)
printf("1\n");
else
printf("2\n");
return 0;
}
在上面的代码中,else 只与它最近的if对应,也就是说它只与 if(a== 1) 有关,与最外面的 if(a == 2) 没有任何关系,第一个if不满足,所以程序不会再执行里面嵌套的if了。 代码运行结果如下
是的,什么都不会输出
2.2 switch 选择结构
那么问题来了,如果分支太多,怎么办? 就比如我想写一个今天是星期几的程序。 用 if else 分支语句如下。
#include <stdio.h>
int main() {
int day = 1;
if (day == 1)
printf("星期一\n");
else if (day == 2)
printf("星期二\n");
else if (day == 3)
printf("星期三\n");
else if (day == 4)
printf("星期四\n");
else if (day == 5)
printf("星期五\n");
else if (day == 6)
printf("星期六\n");
else if (day == 7)
printf("星期日\n");
return 0;
}
有没有感觉 else if 太多,感觉太麻烦,又很繁琐呢?
这时,我们就可以尝试使用 switch 语句,它的功能和 if … else 是一样的,只是它看起来不会那么繁琐 ,代码如下。
#include <stdio.h>
int main() {
int weekday = 1; //星期数
switch (weekday)
{
case 1:printf("星期一\n"); break;
case 2:printf("星期二\n"); break;
case 3:printf("星期三\n"); break;
case 4:printf("星期四\n"); break;
case 5:printf("星期五\n"); break;
case 6:printf("星期六\n"); break;
case 7:printf("星期日\n"); break;
default:
break;
}
return 0;
}
switch() 的 括号里面是不能放浮点数的, 然后程序根据括号里面的值,找到对应的 case 值,并且碰到 break 结束。 如果没有在结尾加上break,那么程序就会执行下一个 case 直到遇到break 。 代码演示如下
如上代码所示, weekday 为3,找到对应的case 值后,为星期三,因为没有break,所以它会执行下一个case 语句,直到遇到break它才会停下来,这就是break 在 switch分支语句的作用。
2.2.2 default 子句
那么default 句子的作用是什么呢? 它就相当于 else,当上面所有的case 语句都不满足时,执行default语句里的内容。 代码执行如下
因为 weekday = 8, 而switch 没有找到 与之对应的 case 语句,那么就会执行default 里面的内容, 输出输入错误。
3. 循环语句
循环,字面意思,就是循环一直做某件事,比如我们要打印 1- 10 的数字,我们可以用10条printf()函数打印,也可以1个 printf()函数打印10个。但是有没有感觉这样很麻烦呢? 如果我要同时打印1-100,1-1000,那单单用printf()函数是非常麻烦的,因此C语言 有 循环语句,专门用来做重复的事情,可以有效的减少代码量和时间,所以今天要给大家介绍的是C语言的几种循环。
3.1for 循环
3.1.1 for循环的格式
for 循环可以说是最常见的循环,那么它的格式是怎样的呢? 可以先来看看一段for循环的代码
#include<stdio.h>
int main()
{
int i = 1;
for(i=1;i<=10;i++)
printf("%d ",i);
return 0;
}
从上面的代码,我们可以看到for 循环的格式是for(i = 1 ; i <= 10 ; i++){ }
那么一起来看看运行结果
我们可以看到打印结果是 1 - 10 的数字,而我们每次输出的值都是 i,这就说明我们的 i 是时刻都在变化的, 并且打印到10停止,就说明 i 的变化是有范围限制的。 i的变化是每次 +1, i的范围最大是10。所以for循环的格式就很好理解了
3.1.2 for循环的循环流程
for 循环的流程,可以大致分为 以下6个步骤。
1. 程序进入循环
2. 循环值的初始化
3.条件判断,判断循环是否满足条件
4.执行循环体,也就是要循环的内容
5.循环值的变化
6.跳到步骤3,继续进行条件判断,如果满足条件,再次执行4.5.6步骤,直接步骤3 条件判断,不满足条件即可跳出循环
3.1.3 for循环中的continue
continue 是一个用于循环的关键字,意思就是结束本次循环,直接开始下次循环。
#include<stdio.h>
int main()
{
int i = 1;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
我们给循环加了一个条件,如果 i == 5 ,则执行一次 continue,那让我们看看这个程序的结果
运行结果是 1 2 3 6 7 8 9 10 , 没有了5,因为当 i == 5时,直接continue了,continue 就是直接结束本次循环,也就是直接跳到以上的步骤4。
3.2 while 循环
3.2.1 while循环的格式
老规矩,我们先来看一段 while 循环的代码
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
运行结果
从运行结果上看,打印了 1-10
所以我们应该可以理解, while ( i <= 10 )是循环的判断条件,当i不满足这个条件时,循环就停止了。 所以
while循环有点类似于if 判断,但if 只循环一次,while 循环到条件不满足为止。所以while循环的循环格式很简单。
但是使用while循环时,我们必须注意一些事项。 那就是必须在循环体中要有可以使循环最后停止的语句,这是为了让代码执行到一定程度可以停下来,否则会进入死循环 。 就比如上面代码中的 i++ , 每次循环 i 就会 +1,等i>10的时候,不满足 i <=10 这个条件,while循环就会终止。
3.2.2 while循环流程
while循环的循环流程就没有那么繁琐了,可以分为以下4个步骤
1.定义并初始化一个变量,该变量用于控制循环
2.进行条件判断,满足条件进入循环体,不满足跳出循环
3. 假设满足条件,执行循环体里的语句
4. 循环体执行完毕后,继续跳回步骤2,如果依旧满足条件,那么重复步骤
再使用while循环时一定要注意,要变化值让循环条件慢慢的不满足条件,这样循环最后才会终止。
3.2.3 while循环里的continue
continue 关键字的效果,上面提到过一次,就是直接结束本次循环,开始下一次循环,但是用在while 里面时,我们需要注意一些问题。先让我们来看看下面这段代码。
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
if (i == 5)
continue;
i++;
}
return 0;
}
这段代码,我们在打印语句后面加了一个 if判断, 如果 i == 5时,就continue,先让我们来看看代码的运行效果。
是的,代码循环一直打印5,这是为什么呢? 让我们来解析一下。代码前面四次循环都没有问题,当 第五次循环时,i == 5 ,满足了if条件,随后 continue 直接结束了循环,因此 决定循环结束的 i++ 语句并没有执行。所以 程序进入死循环。
那我们如何解决这个问题呢? 很简单,把 i++提到 if 判断的前面
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
if (i == 5)
continue;
}
return 0;
}
运行结果
1-10 全打印了,那是因为 printf();在 if判断语句的前面, continue 没有其他语句了,我们把 打印放在后面再看看,要注意一点,如果打印放在i++的后面,那么i的初始化值 就只能是 0 ,条件判断也不能是 <=10,而是<10了,因为是先 ++之后再打印。
运行结果
3.3 do while 循环
do while 循环本质就是while 循环,但是它与while 循环有一点不同的地方,那就do while 它至少会循环一次,while 循环是先判断,再执行,它是先执行,再判断
3.3.1 do while 循环的格式
老规矩,上一段 do while 循环的代码
#include<stdio.h>
int main()
{
int i = 1;
do{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
从代码中,我们可以看出, do while的循环体,再 do 后面的大括号,循环条件还是在while() 的小括号中。
3.3.2 do while 的循环流程
前面说过,do while 循环是先执行,后判断,因此do while循环分为以下四个步骤
1. 初始化变量
2. 执行循环体
3. 进行条件判断
4. 条件满足重新进入循环体,也就是执行步骤2,不满足结束循环
那么是怎么确定它是先执行一次再循环的呢? 我们可以直接把循环条件判断为假,再执行一次代码,看看效果。
#include<stdio.h>
int main()
{
int i = 1;
do{
printf("%d ", i);
i++;
} while (0);
return 0;
}
条件判断,0为假,非0为真,所以 while(0) 是直接判定为假
然后我们再来看看执行效果
还是打印了1,而这个1 又刚好是 i的初始值,所以证明do while的确是先执行,再判断的。 除了这点差异,do while 和while 其他并无太大区别
3.4 break关键字
3.4.1 break 跳出循环
我们在switch 选择语句中提到过 break 关键字,switch 里的break 关键字的作用是使case 不再往下执行。那么break关键字用在循环里有什么作用是直接跳出所在循环,我们先来看一段代码。
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
break;
}
printf("%d ",i);
}
return 0;
}
我们可以看到 当 i == 5时,就使用 break关键字,接下来我们来看看程序的运行结果。
输出结果是 1 2 3 4,而并不是1-10,当 i == 5 的时候,循环就不再继续了。因为 break 使循环直接结束了。如图所示
3.4.2 嵌套循环时的break
前面强调,break 只跳出当前循环 。 所以当循环嵌套时,break 只会结束它所在的一层循环,而不会结束外层的循环。下面有一段循环嵌套的代码。
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 1; i < 5; i++)
{
for (j = 1; j <= 10; j++)
{
if (j == 5)
{
break;
}
printf("%d ", j);
}
}
return 0;
}
我们在一个循环里面嵌套了一个循环,并在里面的循环里面使用了break语句,那我们来测试一下 break 能否结束外层循环呢? 让我们看看运行结果。
从运行结果来看, j == 5 时,里面的循环直接跳出了,但外面的循环依旧再继续。 我们可以看看当 j ==5时 这个程序的执行过程。
所以 break 只能结束 break 所在的那层循环,无法影响外层循环。