介绍
如果从我们身边的日常处理事情的角度来讲,可以大致将我们的思维划分为三个类别,因此一门完美的编程语言需要与人的认知思维相符合。C语言是一门结构化的程序语言,这里的结构化包括顺序结构、选择结构、循环结构。这篇内容介绍选择结构,选择结构也被称作分支。
C语言中的选择结构包括if语句和switch语句。
1 if 语句
1.1 if
if语句的语法格式
if(表达式)
语句
说明:
1、表达式中的值为真,代码块中的语句开始执行,如果为假停止执行,跳过改代码块中的语句。
2、在C语言中对于一个表达式或整数,如果表达式或整数的值为零则为假,非零则为真。
例1:输入一个数判断是否为偶数
#include<stdio.h>
int main() {
int num = 0;
scanf("%d", &num);
if (num % 2 == 0) {
printf("%d是偶数。\n",num);
}
return 0;
}
1.3 if...else语句
if...else语句的语法格式:
if(表达式){
语句1;
}
else{
语句2;
}
说明:
如果表达式的值为真(即表达式的值为非零)执行语句1,如果表达式的值为假(即表达式的值为零)执行语句2。
例2:判断一个数是奇数还是偶数
#include<stdio.h>
int main() {
int num = 0;
scanf("%d", &num);
if (num % 2 == 0)
printf("%d是偶数\n", num);
else
printf("%d是奇数\n", num);
return 0;
}
例3:输入一个人的年龄判断是否成年
#include<stdio.h>
int main() {
int age;
scanf("%d", &age);
if (age >= 18)
printf("已经成年\n");
else
printf("未成年\n");
return 0;
}
1.4 if或else分支中包含多条语句
说明白这个问题先举下面的一个例子
例4:输出一个数并判断这个数是奇数还是偶数
如果这样写就会报出下面的错误:
因此,为了解决这个问题只需在if和else语句后加上一个大括号
#include<stdio.h>
int main() {
int num;
scanf("%d", &num);
if (num % 2 == 0) {
printf("这个数%d",num);
printf("是偶数\n");
}
else {
printf("这个数%d", num);
printf("是奇数\n");
}
return 0;
}
说明:在if或else语句后面的大括号中的语句成为复合语句或者程序块。
1.5 if语句的嵌套
if语句中可以再包含if语句;else语句中可以再包含else语句。
如果通过一层if或else语句后仍然需要对条件进行判断选择,这时就需要在if或else的这个分支中再加一层或多层if或else语句,满足我们的需要。
例5:输入一个数判断该数的正负
#include<stdio.h>
int main() {
int num;
scanf("%d", &num);
if (num == 0) {
printf("这个数是0\n");
}
else {
if (num > 0) {
printf("这个数是正数\n");
}
else{
printf("这个数是负数\n");
}
}
return 0;
}
在if或else语句中包含if或else语句是C语言的基本语法;当然也可以用...else if...来对多重条件进行判断,但这不是标准的语法结构。
例6:输入数字1~7,将数字对应的星期几输出
#include<stdio.h>
int main() {
int num;
scanf("%d", &num);
if (num == 1)
printf("今天是星期一\n");
else if (num==2)
printf("今天是星期二\n");
else if (num == 3)
printf("今天是星期三\n");
else if (num == 4)
printf("今天是星期四\n");
else if (num == 5)
printf("今天是星期五\n");
else if (num == 6)
printf("今天是星期六\n");
else
printf("今天是星期天\n");
return 0;
}
1.6 关于else的一个问题
如果一个程序中有多个if或者是else语句,那么该else语句总是和相离最近的if语句进行匹配。
例7:判断该程序的输出结果
说明:该程序的运行结果为空。else是与第三个if相匹配的,但是在第二个if时判断结果为0,所以不执行第二个if语句的内容因此结果为空。
合理的对齐格式有助于更好的理解代码,上面的代码可写成如下的方式。
#include<stdio.h>
int main() {
int m = 1;
int n = 0;
int t = 2;
if (m == 1) {
if (n == 1) {
if (t == 2)
printf("good\n");
else
printf("bad\n");
}
}
return 0;
}
2 switch语句
switch语句可以替代多重else if语句,通过表达式的值将程序分为多个分支使程序更加易用、可读性更好。
2.1 switch
switch语句的语法格式:
#include<stdio.h>
int main(){
switch(expression)
case one :
语句1;
break;
case two :
语句2;
break;
default :
语句3;
break;
return 0;
}
说明:switch语句首先需要将表达式expression的值进行判断,然后程序会指向case后书写的值与判断结果相等的部分,执行相应的语句。如果没有case的值与表达式expression的值匹配,那么执行default中的语句。
注意:
1、switch括号内的控制表达式必须是整数类型(即expression这个表达式的值必须是一个整数)。
2、case后面的one、two...等值必须是整形常量表达式,且必须与case中间有一个空格。
3、每一个case子句或switch子句中的代码执行完成之后须在最后加上break。
4、switch语句中case子句和default子句之间的顺序没有要求,但通常将default子句放在所有case子句之后。
例7:显示整数除以3所得余数的程序代码
#include<stdio.h>
int main() {
int num;
scanf("%d", &num);
switch (num % 3) {
case 0:
printf("余数为0\n");
break;
case 1:
printf("余数为1\n");
break;
case 2:
printf("余数为2\n");
break;
default:
printf("输入数据格式不正确\n");
break;
}
return 0;
}
2.2 case语句中没有break的后果
如果将上面例7的程序中的break去掉观察一下情况。
分析:3的余数为0,打印时原本只有第一行结果,但是又多出来了余数为1,余数为2,输入格式不正确的结果。造成这种结果的原因是switch语句是分支语句,使用break才能跳出switch语句,如果某一个case语句没有break程序会顺着继续执行下一个case或default语句直到程序执行完或者遇见一个break为止。因此break使switch语句具有了分支的功能。
当然break并不是每一个switch语句中必须都要有,有时间要根据解决问题的实际情况进行选择,请看下面一个例子。
例8:输入1~12中的数字,结合输入的数字在屏幕上打印相应的月份
#include<stdio.h>
int main() {
int month;
scanf("%d", &month);
switch (month) {
case 1:
case 2:
case 3:
printf("第一季度\n");
break;
case 4:
case 5:
case 6:
printf("第二季度\n");
break;
case 7:
case 8:
case 9:
printf("第三季度\n");
break;
case 10:
case 11:
case 12:
printf("第四季度\n");
break;
default:
printf("输入数据格式不对\n");
break;
}
return 0;
}