如果我们的代码中出现根据情况不同,选择不同的执行方式,或想要不同的结果,那么需要分支语句。而分支语句又分为很多种,但都不难理解,接下来我们逐一介绍
if语句
代码格式
单分支
#inclued<stdio.h>
int main()
{
if (表达式)
{
语句1
}
else
{
语句2
}
return 0;
}
多分支
#inclued<stdio.h>
int main()
{
if (表达式1)
{
语句1
}
else if (表达式2)
{
语句2
}
else
{
语句3
}
return 0;
}
在 以上 if 语句中
如果表达式1为真则执行语句1 ,若表达式2为真,则执行语句2,若均为假,则执行语句3.
让我们举个例子
#include<stdio.h>
int main()
{
int a = 5;
if (a < 0)
{
printf("a比0小\n");
}
else if (a == 0)
{
printf("a的值为0\n");
}
else
{
printf("a比0大\n");
}
return 0;
} //打印 a比0大
从以上代码可见 a不满足前两条表达式,所以不执行前两个printf语句,选择执行第三个。
易犯错误
逻辑错误
#include<stdio.h>
int main()
{
int a = 10;
if (1 < a < 5)
printf("1");
else
printf("2");
return 0;
} //打印结果为1
我们来看上面的代码
a的值为10 ,比1要大,但比5小,本该是不满足表达式 并打印2,但为什么却打印了1呢?
因为这是一个错误的代码,所以会得到一个错误的结果。
我们来看第一个表达式
if ( 1 < a < 5 )
虽然看上去没什么问题,但是其中隐藏一个坑
我们都知道在c语言中 :0为假,非0为真。在这段表达式执行的时候
会先判断 1 < a 是否为真 ,为真则为1,所以 1 < a 就变成了 1
代码继续执行 1 < 5,为真。 那么会判定为该表达式为真,该 if 分支条件满足,执行表达式1
最后打印 1
正确的写法应该是以下写法
#include<stdio.h>
int main()
{
int a = 10;
if (1 < a && a < 5) //更改表达式写法
printf("1"); //判断是否同时满足两个条件
else
printf("2");
return 0;
} //打印结果为2
有关大括号
当 if 语句后面只有一条语句时可以不加大括号
但如果有两条以上语句时必须加上大括号,否则会报错
#include<stdio.h>
int main()
{
int a = 0;
if (a < 0)
printf("1"); //单条语句不需要大括号
if (a >= 0)
{
printf("2"); //多条语句必须加大括号
printf("3");
}
return 0;
}
悬空else
我们先来看看以下代码
#include<stdio.h>
int main()
{
int a = 0;
int b = 0;
if (a == 1)
if (b == 2)
printf("1\n");
else
printf("2\n");
return 0;
}
以上代码会输出什么?
错误的解法:因为 a = 0,不满足第一个if表达式,所以跳过后面的代码,执行else,打印2
而实际上,却是什么都不会打印
else 并不是和谁对齐就和谁一组,而是和最近的if为一组,所以实际的执行顺序为
因为不满足 a==1,所以后面的语句不执行,因为下面的 if 和 else为一组,所以直接跳过,什么都不打印。让我们加上大括号,让代码变得更直观
#include<stdio.h> int main() { int a = 0; int b = 0; if (a == 1) { if (b == 2) printf("1\n"); else printf("2\n"); } return 0; }
如果真的想要让第一个if和 else为一组 ,方法也很简单,用大括号括起来就好了
#include<stdio.h> int main() { int a = 0; int b = 0; if (a == 1) { if (b == 2) printf("1\n"); } else printf("2\n"); return 0; }
= 和 ==
废话不多说,直接上代码
#include<stdio.h>
int main()
{
int a = 0;
if (a = 1)
printf("1");
return 0;
} //打印1
a的值是0,不是1,理论上应该是什么都不打印,但为什么偏偏打了个1呢?
答案很简单 ,只需要把 a = 1改成 a == 1 即可
因为 == 才是判断是否相等, = 是赋值,即把1赋给了a,导致表达式变成了
#include<stdio.h>
int main()
{
int a = 0;
if (1) // a = 1,1为真
printf("1");
return 0;
} //打印1
1为真,表达式为真,故执行 printf
如何防止自己犯这种错误呢?
很简单 只需要改一下习惯,当我们需要执行判断语句的时候
我们不再使用 a == 0,改为使用 0 == a,把表达式反过来。
这样即便我们漏写了一个 = ,也不会因为未被发现导致代码产生错误的结果。
我们直接将逻辑错误变成语法错误,编译器直接报错, 0 = a 编译器跑不过去
这样我们就能直接找到错误所在,而不会漏掉产生bug。
switch语句
switch语句常用与多分支
例如,输入一个1-7的数字,输出:星期一 ~ 星期天
如果使用if语句是十分麻烦的,这个时候switch就显得十分简洁方便
switch的使用格式
include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
switch (整形变量表达式) //当变量表达式所表达的量与其中
{ //一个case语句中的常量相符时
case 常量1: //从相符的case开始执行
语句1;
break; //break表示跳出switch语句,不再向下执行
case 常量2:
语句2;
break;
case 常量3:
语句3;
break;
default: //若均不满足,则执行default
语句4;
break;
}
return 0;
}
我们来试试这个代码
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:
printf("星期一");
case 2:
printf("星期二");
case 3:
printf("星期三");
case 4:
printf("星期四");
case 5:
printf("星期五");
case 6:
printf("星期六");
case 7:
printf("星期天");
default:
printf("输入错误");
}
return 0;
}
当我们输入4会发生什么?打印星期四么?不,会打印
星期四星期五星期六星期天输入错误
为什么呢?
因为switch不像if那样只执行满足条件的表达式,而是从相符的常量开始一直向后执行,case只是个起点,是一个入口,并不是选项。当a=4,那代码将会从case 4开始 ,一直执行到最后,
所以,我们需要break
break是跳出当前循环语句或switch语句,不再向后执行。所以我们的代码应该写成
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:
printf("星期一");
break;
case 2:
printf("星期二");
break;
case 3:
printf("星期三");
break;
case 4:
printf("星期四");
break;
case 5:
printf("星期五");
break;
case 6:
printf("星期六");
break;
case 7:
printf("星期天");
break;
default:
printf("输入错误");
break;
}
return 0;
}
这样就不会继续向后执行了
但 并不是说不加break就是错的,这是根据代码需求来决定,有时需要向后执行就不加break。
比如我们希望区分工作日和假日,就可以这样写
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
default:
printf("输入错误");
break;
}
return 0;
}
switch可以嵌套使用
#include<stdio.h>
int main()
{
int a = 3;
int b = 2;
switch (a)
{
case 1:
printf("1");
break;
case 2:
printf("2");
break;
case 3:
switch(b) //switch可嵌套使用
{
case 1:
printf("1");
break;
case 2:
printf("2");
break;
case 3:
printf("3");
break;
default:
printf("4");
break;
}
break;
case 4:
printf("4");
break;
default :
printf("5");
break;
}
return 0;
} //打印 2