本节目总导演:rampant boy
本节目总编剧:rampant boy
本节目总策划:rampant boy
本集将重点介绍分支语句和循环语句。下面进入正文:
C语言中有一个;(分号)隔开的就是一条语句。
例如:
printf("haha");
3 + 5;
;//空语句
上面所列举的三个例子就是三条语句。
if语句的语法结构为:
if(表达式)
语句;
如果表达式为真,则执行语句。
在C语言中,非0就是真,0就是假。
一般地,if与else连用,比如:
if(表达式)
语句1;
else
语句2;
如果表达式为真,则执行语句1,否则,执行语句2。
多分支的情况下:
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
如果表达式1为真,则执行语句1;如果表达式1为假,但表达式2为真,则执行语句2。如果表达式1和表达式2均为假,则执行语句3。
我们可以举一些具体的例子:
int main()
{
int age = 20;
if(age >= 18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
那么这段代码执行之后结果为:
当把age赋值为10,那么结果为:
如果我们在printf(“未成年\n”)下面再加上一条语句,比如printf(“要好好学习\n”)。同时,我们将age赋值为20,那么此时,这段代码的执行结果应该为:成年。那会不会真的如我们所料呢?我们可以执行来看一看。
这时候,要好好学习也被打印出来了,这是为什么呢?
因为if和else后面只能控制一条语句。如果想控制多条语句,就得加上{}。
例如:
int main()
{
int age = 20;
if (age >= 18)
printf("成年\n");
else
{
printf("未成年\n");
printf("要好好学习\n");
}
return 0;
}
那么当我们再次运行的时候,这段代码只会打印成年。
如果我们将age改为10,那么结果为:
下面我们列举多分支结构的具体例子:
int main()
{
int age = 60;
if (age <= 7)
{
printf("幼年\n");
}
else if (age > 7 && age <= 16)
{
printf("少年\n");
}
else if (age > 16 && age <= 45)
{
printf("青年\n");
}
else if (age > 45 && age <= 65)
{
printf("中年\n");
}
else
{
printf("老年\n");
}
return 0;
}
那么这段代码的结果为:
注:&&的用法已经在上一集介绍过,这里的age > 7 && age <= 16意思为age大于7,小于等于16。在C语言中,表示age大于7,小于等于16不能写成7
如果写成这样,那么当age赋值为60的时候,这条表达式仍为真。我们可以验证一下:
因为这条语句是这样执行的:age>7,为真,那么age>7的结果为1,而1小于16,所以7
当然,上面这段代码也可以写为:
int main()
{
int age = 60;
if (age <= 7)
{
printf("幼年\n");
}
else if (age <= 16)
{
printf("少年\n");
}
else if (age <= 45)
{
printf("青年\n");
}
else if (age <= 65)
{
printf("中年\n");
}
else
{
printf("老年\n");
}
return 0;
}
这两段代码所表示的意思是一样的。
我们先来看这样一段代码
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
如果我们通过直觉判断,这段代码最后的结果应该是打印haha,那么结果真的如我们所料吗?我们可以验证一下:
我们可以看到,这段代码最终结果是什么都没打印。为什么会这样呢?
因为else与离它最近的if匹配。也就是说,这段代码相当于:
int main()
{
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
}
return 0;
}
因为a不等于1,所以最终什么都没打印。
switch语句也是一种分支语句,常用于多分支情况。语法形式为:
switch(整型表达式)
{
语句项;
}
语句项为case语句,形式为:
case 整型常量表达式:
语句;
我们举个具体的例子,例如我们输入几,那么就打印星期几。具体代码如下:
#include
int main()
{
int day = 0;
scanf("%d", &day);
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语句和case语句的用法:给day赋一个值,例如赋值3,那么就执行case 3后面的语句。我们可以来验证一下:
通过这个结果我们可以知道,给day赋值3,那么代码就会从case 3之后开始执行,直到执行到case 7。也就是说,switch后面的整型常量表达式决定了语句项的入口。但是,我们要的效果是:输入几,就只打印星期几。要想实现这样的结果,就得使用一个关键字——break。
break意为跳出,决定了出口,上述代码修改后为:
#include
int main()
{
int day = 0;
scanf("%d", &day);
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;
}
那么case后面一定得加break吗?未必,这就得根据需求来决定了。比如:如果我们输入1-5,就打印工作日,输入6-7,就打印休息日。具体代码如下:
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
}
return 0;
}
我们可以来验证一下,例如输入2:
所以case后面的break不是一定得加上的。
我们使用switch语句的时候可能会出现这种情况:表达式的值与所有的case后面的值都不匹配。这时程序不会终止,也不会报错,因为这种情况在C语言中并不认为适合错误,只是所有语句都被跳过而已。但是,如果我们并不想忽略不匹配的所有语句,那么可以在语句列表中增加一条default子句。格式如下:
default:
语句;
当switch表达式的值与所有case标签的值都不匹配的时候,程序就将执行default子句后面的语句。因此,每个switch语句中只能出现一条default语句。但它可以出现在语句列表的任何位置。
例如,还是上述那段代码——输入几,就打印星期几。如果我们加上default子句:
int main()
{
int day = 0;
scanf("%d", &day);
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;
default:
printf("输入错误\n");
break;
}
return 0;
}
我们在default子句后面加上了printf(“输入错误\n”),那么当我们输入的不是1—7,那么就会打印输入错误。例如我们输入8:
这就是default子句的使用。
while循环的语法结构为:
while(表达式)
循环语句;
如果表达式的结果为真(非零),那么就执行循环语句;如果表达式的结果为假(零),那么就不执行循环语句。
例如我们用while循环来实现打印1—10,代码如下:
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
我们可以验证一下:
在while循环中,break用于永久终止循环,例如下面这段代码:
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
break;
printf("%d ", i);
i++;
}
return 0;
}
这时,当i等于5时,循环就会终止,最终打印结果为1 2 3 4。我们来验证一下:
这就是while循环中break的使用。
在while循环中,continue的作用是跳过本次循环中continue后边的代码,直接去判断部分,判断是否进行下一次循环。例如下面这段代码:
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i++;
}
return 0;
}
当i等于5的时候,程序并不会向下执行,打印5,而是会自动转到while(i <= 10)进行判断。所以i就一直为5,这段代码最终就会死循环。我们来验证一下:
光标一直闪,说明程序并未结束,而是死循环。
这就是while循环中continue的使用。
for循环的语法形式:
for(表达式1;表达式2;表达式3)
循环语句;
表达式1为初始化部分,用于初始化循环变量;表达式2为条件判断部分,用于判断循环何时终止;表达式3为调整部分,用于循环条件的调整。
我们来举一个具体的例子,例如:用for循环打印1—10。具体代码如下:
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
执行结果如下:
在这段代码中,i=1为初始化部分,i<=10为判断部分,i++为调整部分。
那么while循环和for循环的区别在哪?
int i = 0;
//实现相同的功能,使用while
i = 1;//初始化部分
while(i<=10)//判断部分
{
printf("%d ",i);
i++;//调整部分
}
//实现相同的功能,使用for
for(i = 1;i <= 10;i++)
{
printf("%d ",i);
}
可以发现,在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。for循环的使用频率更高。
在for循环中,break用于终止循环。
例如下面这段代码:
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
那么最终结果应该是打印1 2 3 4,我们可以来验证一下:
这就是for循环中的break的使用。
在for循环中,continue的作用是跳过本次循环中continue后边的代码,直接去调整部分。然后再判断是否进行下一次循环。
例如下面这段代码:
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
那么这段代码的最终结果应该是打印1 2 3 4 6 7 8 9 10。我们来验证一下:
这就是for循环中continue的使用。
for(;;)
这种是将三个部分都省略。但当判断部分省略的时候,判断部分恒为真,就会造成死循环。例如这段代码:
int main()
{
for (;;)
{
printf("hehe\n");
}
return 0;
}
执行结果为:
这样就会造成死循环。
for循环中两个变量,例如下面这段代码:
int main()
{
int x = 0;
int y = 0;
for (x = 0, y = 0; x < 2 && y < 5; x++, y++)
{
printf("hehe\n");
}
return 0;
}
我们可以运行一下:
那么这段代码就说明,for循环的三个部分中是支持有两个变量存在的。
do…while()循环的语法为:
do
循环语句;
while(表达式);
先执行一次循环语句,然后再进行判断。如果表达式为真,则再进入循环:如果表达式为假,则跳出循环。
下面我们来举个例子,例如:打印数字1—10。具体代码如下:
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
代码执行结果为:
do…while()循环中的continue和break与while循环中的continue和break作用相同,这里就不再详细讲解。下面两段代码即为continue和break在do…while()循环中的应用:
C语言中提供了可以随意滥用的goto语句和标记跳转的标号。从理论上goto语句是没有必要的,实践中没有goto语句也可以很容易地写出代码。但是在某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
我们举个具体的例子:
int main()
{
flag:
printf("hehe\n");
printf("haha\n");
goto flag;
return 0;
}
当然,这段代码是死循环,我们可以运行看一下结果:
如果大家有兴趣,可以看看这篇博客——使用goto语句个性关机。看完之后或许对goto语句有个更深刻的理解。
当然,goto语句真正适合的场景如下:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
...
error:
if(disaster)
//处理错误情况
注:goto语句只能在一个函数范围内跳转,不能跨函数
例如:
void test()
{
flag:
printf("test\n");
}
int main()
{
goto flag;
return 0;
}
那么这段代码的执行结果为:
所以,goto语句只能在一个函数范围内跳转,不能跨函数。
本集完!!!
上一集:Hello!C先生
下一集预告:函数帝国的崛起