今天介绍分支与循环语句,希望大家看过会轻松玩转分支与循环语句!
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类:
- 条件判断语句也叫分支语句:if语句、switch语句;
- 循环执行语句:do while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句。
人生中常会面临选择。比如现在你是一位大学生,一位美女选择了你,而你可以选择和她在一起,也可以选择努力学习,为自己的将来做准备。那么你会选择哪个呢?果真很难选择
(1)if语句的语法结构
每个if(表达式)语句里放的都是表达式,如果表达式为真,则执行下边的语句,如果不是真,则判断下一个分支语句。
C语言里:0表示假,非0表示真
注意:
if语句一个分支只能出现一次,且在最前放。(一个分支的开始)
else在if语句中只能出现一次而且只能出现在if语句的最后。
else语句可以出现多次,且总是在else语句的前面。(一个分支的结束,因为else已经包含了除前面if,else if限定的条件之外的所有条件。因此这个分支结束。)
#include
int main()
{
int choose = 0;
printf("你选则美女(1)还是好好学习(0)\n");
scanf("%d",&choose);
if(1 == choose)
{
printf("你的未来未知\n");
}
else if(0 == choose)
{
printf("你的未来光明\n");
}
return 0;
}
这里剩下的就看大家的选择了。
(2)悬空else问题
大家认为这个代码的结果是什么呢?可以思考一下。
#include
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(a == 1)组队的。其实不是,这个else是与离它最近的if进行匹配的,也就是if(b== 2)。因此一个if判断为假,所以程序就不进入分支,因此直接跳转到return0所以什么也不打印。
因此这既是悬空else,这种else只会与离它最近的if进行匹配。
那么如何避免呢?
就是规范书写:
#include
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
}
return 0;
}
//这样是不是一目了然多了,因此书写代码时尽量把分支语句的{}给带上,这样会使自己的代码逻辑清晰。
int main()
{
int i = 0;
scanf("%d",&i);
if(0 == i)//这里写判断时把变量写在右边比较好,可以避免自己把判断相等写成 = 造成结果错误。
{
printf("haha\n");
}
return 0;
}
//代码1
int main()
{
int i = 0;
scanf("%d",&i);
if(i>10)
{
printf("你好\n");
}
if(i<10)
{
printf("你好美\n");
}
if(10 == i)
{
printf("你好聪明\n");
}
return 0;
}
//代码2
int main()
{
int i = 0;
scanf("%d",&i);
if(i>10)
{
printf("你好\n");
}
else if(i<10)
{
printf("你好美\n");
}
else(10 == i)
{
printf("你好聪明\n");
}
return 0;
}
这里代码1和2的区别看出来了吗?
区别就是:
代码1里无论i值你输入的是多少,三个if语句均会进行判断。
而代码2当你输入的i值大于10,进入第一个if判断语句后,后边的分支语句就不再进行判断。
(1)switch语句的语法形式!
给大家写个代码了解一下:
#include
int main()
{
int day = 0;
switch(day)
{
case 1:
printf("星期一\n");
case 2:
printf("星期二\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
case 5:
printf("星期五\n");
case 6:
printf("星期六\n");
case 7:
printf("星期天\n");
}
return 0;
}
这就是switch语句典型的用法,但是这种用法有明显的缺陷,就是无法及时停止。什么意思呢?就是当你输入1的时候,他会把后面所有的结果全部打印
所以为了制止这样的情况发生,想让仅仅输出自己输入符合case情况的语句,switch语句经常与break结合使用,就会达到预期的结果。
#include
int main()
{
int day = 0;
switch(day)
{
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;
}
return 0;
}
这样的话输入1,此时就仅仅只会输出“星期一”。
break语句 的实际效果是把语句列表划分为不同的分支部分。因此在case后加上break是一个良好的编程习惯。
那么:
#include
//switch代码演示
int main()
{
int day = 0;
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
}
return 0;
}
上面咱们输入的数值因该是1-7,如果咱们输入的数据不在1-7的范围内该如何是好呢?
这时default就该上场表演了。
当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句。
但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
因此上述代码改为这个更为合适:
#include
//switch代码演示
int main()
{
int day = 0;
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("weekday\n");
break;
case 6:
case 7:
printf("weekend\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
这里就完美了。
因此在每个 switch 语句中都放一条default子句是个好习惯,甚至可以在后边再加一个 break 。
循环语句的一员,下面为大家介绍一下:
while语句的语法结构:
下面来实现一个简单的代码:
打印1-10的数字
#include
int main()
{
int i = 1;
while(i <= 10)
{
printf("%d ",i);
i++;
}
return 0;
}
相信大家已经基本了解了,接下来讲解一些while语句中的break和continue。
break介绍
int main()
{
int i = 1;
while(i <=10)
{
if(5 == i)
{
break;
}
printf("%d ",i);
i++:
}
return 0;
}
这里打印的结果就是
1 2 3 4 6 7 8 9 10
那么为什么没5呢?
其实就是break的功能:其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
continue介绍:
int main()
{
int i = 1;
while(i <= 10)
{
if(5 == i)
{
continue;
}
printf("%d ",i);
i++;
}
}
这里打印的结果就是:
1 2 3 4 死循环
由此应该了解到了continue的作用了吧!
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。
已经有了while循环但是为什么还要for循环呢?难道它有些其他的优点么。让我们一起探究一下
下面写个代码展示一下:
打印1-10
#include
int main()
{
int i = 0;
for(i = 0;i<10;i++)
{
printf("%d ",i);
}
return 0;
}
和while循环对比一下:
#include
int main()
{
int i = 0;
for(i = 0;i<10;i++)
{
printf("%d ",i);
}
return 0;
}
#include
int main()
{
int i = 1;
while(i <= 10)
{
printf("%d ",i);
i++;
}
return 0;
}
对比一下你会发现while循环中存在循环中的三个条件,但是可能存在的过于疏远,查找和修改不够集中和方便。但是for循环却集中到了一起,用起来方便很多,也是比较常用的。
break和continue在for循环中的应用:
大家先看一下for循环的执行流程图。
下面来写一些代码来加深理解:
break:
#include
int main()
{
int i = 0;
for(i = 1;i <= 10; i++)
{
if(7 == i)
{
break;
}
printf("%d ",i);
}
return 0;
}
结果是:1 2 3 4 5 6 7
break的作用就是直接结束循环。
continue:
#include
int main()
{
int i = 0;
for(i = 1;i <= 10; i++)
{
if(7 == i)
{
continue;
}
printf("%d ",i);
}
return 0;
}
这里打印的结果是:1 2 3 4 5 6 8 9 10
continue的作用就是直接结束本次循环,然后进入到调整部分。
补充:
#include
int main()
{
for(; ;)
{
printf("你好啊\n");
}
return 0;
}
这里的打印结果是无限打印 “ 你好啊 ”。因为此处省略了判断部分,因此循环判断的结果恒为真。
do while语句的特点就是:至少执行一次。
#include
int main()
{
int i = 0;
do
{
printf("%d ",i);
i++;
}while(i < 10);
}
0 1 2 3 4 5 6 7 8 9
break 和continue在do while循环中的作用
break
int main()
{
int i = 0;
do
{
if(6 == i)
{
break;
}
printf("%d ",i);
i++;
}while(i < 10);
return 0;
}
这里打印的是:1 2 3 4 5
break的作用是直接终止do while循环
continue
int main()
{
int i = 0;
do
{
if(6 == i)
{
continue;
}
printf("%d ",i);
i++;
}while(i < 10);
return 0;
}
这里的结果是:1 2 3 4 5 死循环
continue的作用是结束本次循环,直接到while判断部分。
基本用法:
int main()
{
flag:
int i = 100;
printf("%d ",i);
goto flag;
}
这里会无限循环打印100
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。 从理论上
goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
goto语句适合的场景:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况
了解了之后,这次的介绍就先到这里了哦!