目录
分支语句
在我们的日常生活中,经常会面临着许多的选择,而往往这些不同的选择也伴随着不同的结果,例如在大学中,如果你好好学习,毕业时会有一份好的工作,而如果你不思进取,荒废学业,那么最终在毕业时也会面临失业。
在C语言中就有这么一种语句来描述这些选择以及最终产生的结果。
C语言中的分支语句有两种分别为 if-else语句和switch语句
if -else语句:
首先介绍 if -else语句:
if-else语句的书写格式为
if (条件表达式)
{
语句1;
}
else
{
语句2;
}
- 语句执行的说明:首先判断if括号中条件表达式的值,若为真,则执行语句1,如果条件表达式的值为假,则执行语句2
- 注意: if -else语句中的语句1和语句2,其中只能有一个被执行,也就是说,若执行了语句1,语句2不会再被执行,反之亦然。
- 在条件表达式值中的真或假:非0即为真,是0则为假。
- if -else语句支持嵌套使用。
用一段简单的代码描述:
#include<stdio.h>
int main()
{
int choice = 0;
printf("你会努力写代码吗? (选择1 or 0)\n");
scanf("%d", &choice);
if(choice == 1)
{
printf("好offer");
}
else
{
printf("失业");
}
return 0;
}
此段代码运行结果如下:
当输入1时
输入0时:
if - else语句多分支:
另外,if -else 语句可以实现多分支,其格式为
if ( 表达式 1 )语句 1 ;else if ( 表达式 2 )语句 2 ;else语句 3 ;
这里也以一段代码为例:
#include<stdio.h>
int main()
{
int grade = 0;
printf("请输入成绩 0-100");
scanf("%d", &grade);
if(grade < 60)
{
printf("不及格");
}
else if(grade >= 60 && grade < 85)
{
printf("良好");
}
else
{
printf("优秀");
}
return 0;
}
同样在VS2019中运行结果如下:
if -else语句书写形式:
那么在以上的示例中,if -else中所执行的语句都为单个语句,但是单个语句并不能满足我们的需求,当我们要在其中执行多条语句时,可以使用代码块来实现。
#include <stdio.h>int main (){if ( 表达式 ){语句列表 1 ;}else{语句列表 2 ;}return 0 ;}
- 建议:在使用 if -else语句时,无论需要执行单个语句还是多条语句,都可以用一对{ }将你所要执行的语句括起来,避免出错。
这里一对{ } 就是一个代码块,这种格式就为我们使用if -else提供了更多选择.
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;
}
在这里,很多读者可能认为,在执行第一条if语句时,a == 1为假 ,所以执行else中的语句,输出haha.而实际情况却并不是如此,当我们将这段代码在编译器中运行后,会发现,它什么也不会输出,为什么会这样?
这是因为else的匹配原则,else会与离它最近的if相匹配,即会与第二个if语句匹配,这时我们会发现,由于a == 1为假,程序不会执行到第二个if语句,那么下面的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;
}
当我们将程序以代码块的格式书写后,会发现此时程序的内容一目了然.
所以
- 适当的使用{}可以使代码的逻辑更加清楚。
- 代码风格很重要
switch语句:
switch基本语法:
接下来介绍switch语句:
switch语句也是一种分支语句,常常用于多分支的情况:
例如:
输入 1 ,输出星期一输入 2 ,输出星期二输入 3 ,输出星期三输入 4 ,输出星期四输入 5 ,输出星期五输入 6 ,输出星期六输入 7 ,输出星期日
为什么我们不用if -else if -....来实现呢:形式太过复杂
那C语言给我们提供了另外一种语句来帮助我们实现这些功能.
switch语句语法:
switch(整型表达式)
{
语句项;
}
什么是语句项呢?
如下:
case:整型常量表达式:
语句;
switch语句中的break和continue:
在switch语句中,我们必须搭配break语句才能实现真正的分支:
#include <stdio.h>
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.输入1-5,输出的是"weekday "
2.输入6-7,输出的是"weekend"
我们的代码也应该加以改变:
#include <stdio.h>
int main()
{
int day = 0;
switch(day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("星期五\n");
break;
case 6:
case 7:
printf("星期天\n");
break;
}
return 0;
}
break语句的实际效果是把语句列表划分为不同的部分
default子句:
如果表达的值与所有的 case 标签的值都不匹配怎么办?其实也没什么,结构就是所有的语句都被跳过而已。程序并不会终止,也不会报错,因为这种情况在 C 中并不认为是个错误。但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢?你可以在语句列表中增加一条 default 子句,把下面的标签default :写在任何一个 case 标签可以出现的位置。当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。所以,每个 switch 语句中只能出现一条 default 子句。但是它可以出现在语句列表的任何位置,而且语句流会像执行一个 case 标签一样执行 default 子句。
具体实现如下:
#include <stdio.h>
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;
default:
printf("输入错误");
break;
}
return 0;
}