超详细讲解分支与循环语句等
语句
在开始不同语句的讲解前,我们首先需要知道,什么是语句呢?
C语句可分为以下五类:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
而本篇文章后面主要介绍的是控制语句。控制语句用于控制程序的执行流程,以实现程序的各种结构方式(C语言中支持三种结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类: - 条件判断语句也叫分支语句:if语句、switch语句;
- 循环执行语句:do while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句。
条件判断语句
条件判断语句也叫做分支语句。举个例子,如果你现在好好学习,最后有一个好技能从而找到一份好工作,走上人生巅峰;如果你不学习,毕业等于失业,只能回家卖红薯。这就是一种选择,亦或者说是一种分支的体现。
if判断语句
对于if语句而言,就是属于一种条件判断语句,那么if语句的语法结构是怎么样的呢?
//单分支
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
{
语句2;
语句3;
}
else
语句4;
在上面的代码中,大家可以看到if语句分为单分支与多分支两种情况,对于单分支,如果if中的表达式为真,则会进入if所附带的语句1,否则就会进入else中的语句2。对于多分支而言也同样如此。
在这里我需要补充一下,既然表达式的结果为真,会执行语句。那么在C语言中如何表示真假呢?
那就是:0表示假,非0表示真。
除此之外,如果条件成立,需要执行多条语句,则应该使用代码块 ,就像上述代码中写的一样。若不是用代码块,则只会默认执行if或者else等后面的第一条语句,这对于后面的while循环也是一样的。
else if(表达式2)
{
语句2;
语句3;
} //这里的一对{}就代表了代码块
用代码进行举例。
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age<18)
{
printf("未成年\n");
}
else
{
printf("成年\n");
}
}
需要指出的是,对于三个同时为if的情况与上述的if,else if 与else是不同的,大家需要注意这种情况。
if(表达式1)
语句1;
if(表达式2)
语句2;
if(表达式3)
语句3;
上述的情况,在多个if语句中,所有的if都会进行判断,无论是否满足情况。在if else if else中,只要有一个条件满足,则其余条件不用判断,会直接跳过。
举个例子:
#include <stdio.h>
int main()
{
int a = 0;
if (a == 0)
{
a++;
printf("haha");
}
if (a == 1)
{
a++;
printf("hehe");
}
if (a == 2)
{
printf("hihi");
}
}
最终输出的结果是hahahehehihi。这是因为在多个if语句中,所有的if都会进行判断。
无论第一个语句是否满足情况.在满足表达式时就会执行。
例如一开始a=0进入第一个if后执行了a++,a就变成了1,当进行a==1判断时,也符合,故也执行了第二个if语句。
同理再次a++后a=2,同样执行了第三个if语句。
-------------------------------------------------
#include <stdio.h>
int main()
{
int a = 0;
if (a == 0)
{
a++;
printf("haha");
}
else if (a == 1)
{
a++;
printf("hehe");
}
else
printf("hihi");
}
此段代码最终只输出了haha。在if else if else中,只要有一个条件满足,则其余条件将不会继续进行判断,会直接跳过。
上述代码a=0进入if语句,则执行完if语句后次选择分支结束。
switch判断语句
switch语句可以类比为类似于电路里的开关选择型语句,是一种多分支选择结构,一般与case、break、default配合使用。
switch语句的格式如下:
switch (表达式)
{
case 常量表达式1:
语句1;
case 常量表达式2:
语句2;
……
case 常量表达式n:
语句n;
default: 语句n + 1;
}
其中switch、case、break、default等都是关键词。当switch变量表达式的值对应case中的某个值时,将会执行case后面的语句,在这之后若加入了break则会终止switch语句。如果未有符合的case表达式,则会执行default语句后再跳出switch语句。
但在使用switch语句时,需要注意以下几点:
1、使用switch必须是基本数据类型中的整型类型,例如int类型。
2、使用case的表达式必须为常量表达式,例如case 1;
3、case语句后允许存在多个语句而不使用代码块。
4、对于case语句,若不在其后面语句执行完后加入break;,则会发生依次进入case语句中执行命令,break语句则正是用于终止并跳出switch语句的。
5、default语句从某种意义上没有顺序要求,可以放到开头也可以结尾,但一般建议放结尾。
以我写的猜数字的部分代码为例;
switch (input)
{
case 1:
printf("游戏开始!!\n");
game();
break;
case 2:
printf("退出游戏!!\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
循环执行语句
if语句仅会循环一次,但事实上我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次,因此便出现了循环执行语句,顾名思义进行循环。
while循环语句
while循环语句的结构:
while (表达式)
{
循环语句1;
循环语句2;
}
例如输出1-10的数字:
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i = i+1;
}
return 0;
}
又例如实现多组数据输入:
while (scanf("%d %d", &a, &b) != EOF)
而while循环中同样存在break语句与continue语句。
break语句:执行后停止后面所有的循环即终止循环。
continue语句:终止本次循环,也就是本次循环中continue后边的代码不会再执行,但会再次回到循环语句判断部分。
for循环语句
for循环语句比while循环语句更加便捷(个人认为)
for循环的语法结构:
for (表达式1; 表达式2; 表达式3)
{
循环语句1;
循环语句2;
}
表达式1为初始化部分,用于初始化循环变量。
表达式2为条件判断部分,用于判断循环时候终止。
表达式3为调整部分,用于循环条件的调整。
而实际情况上可能会出现表达式1或表达式2不填的情况。
使用for循环输出1~10数字:
#include <stdio.h>
int main()
{
int i = 0;
//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
除此之外,对于for语句的循环控制变量的取值更建议采用“前闭后开区间”写法。
int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}
除此之外,for循环的一些更综合应用写法可以达到类似于某行某列的输入,跟二维数组有些相像,例如,输出99乘法表。
int main()
{
int lin = 0;
int col = 0;
int product = 0;
for (col = 1; col < 10; col++)//控制列
{
for (lin = 1; lin <= col; lin++)//控制行
{
product = col * lin;
printf("%d*%d=%d ", col,lin,product);
}
printf("\n");
}
}
do…while循环语句
do…while相比而言用的频率没有那么高,因此简约介绍。其循环至少会循环一次。
do语句的语法:
do
循环语句;
while(表达式);
用代码举例:
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i=i+1;
}while(i<=10);
return 0;
}
转向语句
转向语句是用来直接控制程序的执行流程,可用于改变switch选择、for循环、while循环、do-while循环等。
goto语句
goto语句本质上是可以随意滥用的跳至某一位置的语句。从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。但存在即合理,某些场合下仍然需要使用goto语句,其最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。例如:一次性的跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况