初级C语言之【分支语句】
一:什么是语句?
C语言的语句可以分为以下五类:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
1.1:表达式语句:
这就是一个表达式语句
2+3;
1.2:函数调用语句:
就是调用了函数的那条语句就是函数调用语句
1.3:控制语句:
控制语句用于控制程序的执行流程,以实现程序的各种结构方式
C语言支持三种结构:
1、顺序结构
2、选择结构
3、循环结构
它们由特定的语句定义符组成,C语言有九种控制语句。
可分为以下三类:
1、条件判断语句也叫分支语句:if语句、switch语句;
2、循环执行语句:do while语句、while语句、for语句;
3、转向语句:break语句、goto语句、continue语句、return语句。
1.4:空语句:
一个;就是一条空语句。
;
二:分支语句(选择结构)
2.1:if语句
2.1.1:单分支
if(表达式)
语句;
如果表达式的值为真,就执行下面的语句,否则什么也不干。
输入19,结果是成年
输入15,结果什么也没干
2.1.2:双分支
if(表达式)
语句1;
else
语句2;
如果表达式的值为真,就执行语句1,否则执行语句2
输入19,结果是成年
输入15,结果是未成年
2.1.3:多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
表达式1如果为真,就执行语句1,如果为假,则判断表达式2是否为真,如果为真,就执行语句2,否则就执行语句3.
2.1.4:if语句注意事项
2.1.4.1:关于大括号
if或else语句默认只能控制一条语句,如有多条语句要加大括号。这里的大括号叫做一个代码块。
举个栗子:判断年龄是否成年,并规定只有成年了才能谈恋爱。
如果把代码写成下面这样:
此时age=20,成年了可以谈恋爱了,程序的运行结果满足我们的预期。
但当我们输入15时,没有成年,就不能谈恋爱,所以程序应该什么都不输出才对,但实际呢??
输出了谈恋爱,和我们的预期结果有所不同,说明printf(“谈恋爱\n”);这条语句并没有受到if的控制,无论输入什么年龄这条语句都执行了。
将代码稍作修改,给这两条语句加上大括号,可见此时程序的运行结果满足了我们的预期。
2.4.1.2:else的匹配机制
大家看看下面这段代码,猜猜它的执行结果过是什么。
int main()
{
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
你是不是猜的“haha”呢?,哈哈,很抱歉你猜错了。为什么不是“haha”呢?
原因是:这里的else是和第二个if匹配的,大家不要被else的位置迷惑了,看它和第一个if对其了就以为它是和第一个if匹配。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;
}
我们用大括号把后面的一对if和else括起来,这时大家是不是就看的很明白了呢?可见养成一个良好的代码风格是十分重要的。
我们还可以通过加大括号让这个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;
}
此时代码打印的结果就是“haha”了。
2.4.1.3:两段代码的对比
int main()
{
int a = 1;
if (a)
{
return 1;
}
return 2;
}
int main()
{
int a = 1;
if (a)
{
return 1;
}
else
{
return 2;
}
}
上面这两段代码要表达的意思和执行的结果都是一样的,如果表达式a为真就返回1,否则就返回2。第一段代码很可能会误解人,所以我们一定要注意代码风格,让人容易理解。
2.1.4.4:表达式的书写细节
int main()
{
int num = 0;
if (num == 10)
{
printf("hehe\n");
}
return 0;
}
此时我们希望当num等于10的时候程序可以输出“hehe”,显然这里num是0就不会输出“hehe”,这时如果当我们把if后面的表达式 num== 10不小心漏掉了一个等号,写成 num=10,此时代码的运行结果是怎样的呢?我们不妨上机试试。
此时程序不仅没有报错,还打印出了“hehe”,不符合我们的预期。出现这种情况的原因是:num = 10;是一条赋值语句,此时num被赋为10,非0为真,为真的话就会执行if后面的语句。那如何避免这种情况的出现呢?
我们可以把 num == 10; 写成 10 == num;这两条语句表达的意思和执行的结果都是一样的,都是判断num是否等于10.这样写当我们不小心少写一个=的时候,程序就会报错提醒我们。
比较一个变量和一个常量是否相等的时候,建议把常量放在等号的左边
2.1.5:练习
2.1.5.1:判断奇偶数
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 2 == 1)
{
printf("是奇数\n");
}
else
{
printf("是偶数\n");
}
return 0;
}
注意这里不需要把“num % 2 == 1”写成“1 == num%2”,因为这里的“num % 2”是一个表达式,如果我们把“num % 2 == 1”的等号漏掉了一个,代码是编译不过去的。
2.1.5.2:输出1~100之间的奇数
int main()
{
int i = 1;
while (i <= 100)
{
if (i % 2 == 1)
{
printf("%d ", i);
}
i++;
}
return 0;
}
还可以这样来写,下面没有用到if来进行判断,而是用到了算法,奇数之间相差2,最初我们让i=1,此后每次让i加2就可以把1~100的所有奇数打印出来。上面的代码会执行100次循环,而下面的代码只会执行50次循环并且没有判断,效率会大大提高。
int main()
{
int i = 1;
while (i <= 100)
{
printf("%d ", i);
i += 2;
}
return 0;
}
2.2:switch语句
switch语句也是一种分支语句。常常用于多分支的情况。
比如:
- 输入1,输出星期一
- 输入2,输出星期二
- 输入3,输出星期三
- 输入4,输出星期四
- 输入5,输出星期五
- 输入6,输出星期六
- 输入7,输出星期日
此时如果我们写成if else语句的话就十分繁琐。这时我们就可以用上switch语句,代码如下:如果day是3,就执行case 3:下面的printf,然后通过break跳出这个switch。如果day是5,就执行case 5:下面的printf,然后通过break跳出这个switch。
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;
}
2.2.1:注意break关键字的使用
需要注意的是,这里的case仅仅是选择分支的入口,比如当day等于3的时候,程序会从case 3: 这个入口进去,执行后面的语句,break就是出口,当执行到break的时候,程序会跳出switch,如果没有这个switch会发生什么结果呢?让我们来试试:
可见,去掉break后,我们再输入3,程序把星期三~星期天都打印出来了。原因就是这里没有break,当输入3后,程序从case 3: 这个入口进去,执行完 “printf(“星期三\n”);”后,没有让其停下来的语句,此时就会接着往后执行,直到输出星期天为止。
case决定入口,break决定出口。
2.2.2:default子句
这时又有一个新的问题,当我们输入8的时候,没有与之匹配的case。这时该怎么办呢?
按照上面的代码,输入8后什么结果也不会有,如果想对其进行提示,告诉他输错了,该怎么办呢?此时就要用到我们的default了。
default就是当所有的case都不匹配的时候,就会执行default后面的子句。
switch语句里面的case和default只要逻辑上是对的,他们没有顺序可言,也就是说可以随便交换两个case的位置都不会对程序造成任何影响。但习惯上我们会把default子句放在最后面
2.2.3:switch语句的语法要求
- switch后面括号里的表达式必须是一个整形表达式。
switch(整型表达式)
{
语句项;
}
我们定义一个浮点型变量f,让它=1.2,然后把它放进switch后面的括号里去,这时程序就会报错了。
- case 后面必须是整型常量表达式
比如我们可以把“ case 2:”写成“ case 1 + 1:”这样也是可以的,但千万不能是变量。
这里我们定义了一个变量n让它等于2,然后把这个n放到case后面,这时程序就会报错。
2.2.4:case后面不一定需要break
如果我们希望输入1-5的时候程序输出工作日,输入6-7的时候程序输出休息日,正常思路我们会把代码写成下面这样:
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");
default:
printf("选择错误\n");
break;
}
return 0;
}
但其实我们还有一种更好的方法,就是把代码写成下面这样:
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");
default:
printf("选择错误\n");
break;
}
return 0;
}
当day为1-5中的任何一个数字,程序从相应的case入口进去后,就比如当程序从case 3:进去后,由于没有break暂停跳出,程序会一直往下执行,当执行完case 5:中的 printf(“工作日\n”);后,遇到了break,此时程序就会跳出switch。此时代码就显得十分简洁。
当多个case要执行同一条语句的时候,就可以按照上面的方法去写代码。
2.2.5:练习
大家可以看看下面这段代码,判断一下程序的结果是什么。
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{//switch允许嵌套使用
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
结果是m = 5, n = 3,你有没有作对呢?其实只要注意break,这道题是很容易作对哒。break只会跳出本次所在的switch。另外,switch是可以嵌套的。
今天就分享到这里啦,喜欢的话可以点赞、评论和收藏哟!
- 点赞
- 收藏
- 关注作者
评论(0)