文章目录
在介绍 分支语句之前,我们来看看什么是 语句及 语句的类型?
一.语句和语句分类
1.空语句
空语句最简单,一个分号就是一条语句,即为空语句。
#include<stdio.h>
int main()
{
;//空语句
return 0;
}
空语句使用情况:这里需要一条语句,但是这个语句不需要做任何事情,就可以使用空语句。
2.表达式语句
在表达式的后面加上一个分号,即为表达式语句。
#include<stdio.h>
int main()
{
int a=10;
int b=0;
b=a+10;//表达式语句
return 0;
}
3.函数调用语句
在调用函数的时候,也会加上分号,即为函数调用语句。
#include<stdio.h>
int Add(int x,int y)
{
return x+y;
}
int main()
{
int a=10;
int b=20;
printf("hehe\n");//函数调用语句
int c=Add(a,b);//函数调用语句
return 0;
}
4.复合语句
成对括号中的代码就构成⼀个代码块,即为复合语句。
#include <stdio.h>
void print(int arr[],int sz)//函数的大括号中的代码也构成一个复合语句
{
int i=0;
for(i=0;i<sz;i++)
{
printf("%d ",arr[i]);
}
}
int main()
{
int i = 0;
int arr[10] = {0};
for(i=0; i<10; i++) //for循环的循环体:大括号中的所有语句,构成一个复合语句
{
arr[i] = 10-i;
printf("%d\n", arr[i]);
}
return 0;
5.控制语句
控制语句用于控制程序的执行流程,用于实现程序中的各种结构方式(C语言支持三中结构:顺序结构、选择结构、循环结构),它们由特定的语句定义符组成,C语言有九种控制语句。可分成以下三类:
5.1 分支语句(条件判断语句)
if语句,switch语句。
5.2 循环语句
for语句,while语句,do while语句。
5.3 转向语句
break语句,continue语句,goto语句,return语句。
这期先讲分支语句,下一期再讲循环语句以及转向语句二.分支语句
1. if 语句
1.1 if
if语句的语法如下:
if(表达式)
语句
表达式成立(为真),则语句执行。表达式不成立(为假),则语句不执行。在C语言中,0为假,非0为真,也就是表达式结果为0,则语句不执行,表达式结果不为0,则语句执行。
例子:输入一个整数,判断是否为奇数。
include<stdio.h>
int main()
{
int num=0;
scanf("%d",&num);
if(num%2==1)
printf("%d是奇数\n",num);
return 0;
}
1.2 else
如果判断一个正整数,它不是奇数,那就是偶数了,那么该如何表示呢?这里就需要 if…else… 语句了,语法形式如下:
if(表达式)
语句1
else
语句2
例子:输⼊⼀个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num % 2 == 1)
printf("%d 是奇数\n", num);
else
printf("%d 是偶数\n", num);
return 0;
}
1.3 分支中包含多条语句
默认在 if 和 else 语句中默认都只控制⼀条语句,⽐如:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age >= 18)
printf("成年了\n");
printf("可以谈恋爱了\n");
return 0;
}
上⾯的代码,你会发现输⼊的值不管是>=18还是<=18,屏幕上都会打印"可以谈恋爱了"
这是因为 if 语句只能控制一条语句,若 if 语句为真,执行 printf(“成年了\n”); 打印"成年了",若 if 语句为假,不会执行 printf(“成年了\n”); 不打印。对于 printf(“可以谈恋爱了\n”); 是独立存在的,不管 if 语句条件的真假,都会被执行。那么我们要 if 语句同时控制2条语句,该怎么办呢?那就要用{}将代码括起来, else 后也可以跟上{}。如下:
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age >= 18) //if 后使用{} 控制多条语句。这个块也叫:程序块,或者复合语句
{
printf("成年了\n");
printf("可以谈恋爱了\n");
}
else //else 后使⽤{} 控制多条语句。这个块也叫:程序块,或者复合语句
{
printf("未成年\n");
printf("不可以早恋哦\n");
}
return 0;
}
4.1 嵌套 if
在 if else 语句中,if 可以与另一个 if 语句连用,else 也可以与另一个 if 语句连用,构成多重判断,叫 if 的嵌套。
例子:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num == 0)//先判断num是否为0
printf("输⼊的数字是0\n");
else
{
if(num > 0) //若num不为0,在判断num是否大于0
printf("输⼊的数字是正数\n");
else//若num不为0 且 num不大于0 则执行else 中的语句
printf("输⼊的数字是负数\n");
}
return 0;
}
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if(num == 0)
printf("输⼊的数字是0\n");
else if(num > 0) //这⾥的if 相当于嵌套在else语句中,形成了嵌套结构
printf("输⼊的数字是正数\n");
else
printf("输⼊的数字是负数\n");
return 0;
}
上面的两种代码本质上是一样的,只能执行一条 printf 语句,若满足条件,则后面的 printf 语句不会执行,遵循先来后到的原则,对于这种多分支语句我个人推荐第二种。
5.1 悬空 else 问题
如果有多个 if 和 else ,可以记住这样⼀条规则,else 总是跟最接近的 if 匹配。
我们⾸先从下⾯代码开始:
#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;
}
那么程序运⾏的结果是啥?很多初学者,上来以判断 a是否等于1,不等于1,那就执⾏ else ⼦句,打印 haha 但是当你去运⾏代码,输出的结果是:啥都不输出。
为什么呢?这就是悬空 else 的问题,如果有多个 if 和 else 并且没有{},可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。上⾯的代码排版, 看似else 和第⼀个 if 语句对⻬,让我们以为 else 是和第⼀个if匹配的,当 if 语句不成⽴的时候,⾃然想到的就是执⾏ else ⼦句,打印 haha ,但实际上 else 是和第⼆个 if 进⾏匹配的,这样后边的 if…else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不成⽴,嵌套 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;
}
如果我们希望 else 确实和第⼀个 if 匹配,可以这样修改代码:
#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;
}
只要带上适当的⼤括号,代码的逻辑就会更加的清晰,所以⼤家以后在写代码的时候要注意括号的使⽤,让代码的可读性更⾼。
2. switch 语句
2.1 if 语句和 switch 语句的对比
练习:输⼊任意⼀个整数值,计算除3之后的余数。
如果使⽤ if 语句完成,如下:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if(n%3 == 0)
printf("整除,余数为0\n");
else if(n%3 == 1)
printf("余数是1\n");
else
printf("余数是2\n");
return 0;
}
如果使⽤ switch 语句改写,就可以是这样的:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
default:
break;
}
return 0;
}
对于多分支语句选择 if 语句,还是 switch 语句,仁者见仁智者见智。
switch 语句中,我们要注意的点有:
- case 和后边的数字之间必须有空格。
- 每⼀个 case 语句中的代码执⾏完成后,需要加上 break,才能跳出这个 switch 语句。
- switch() 内必须是整形表达式。
- case 后面的值必须是整形常量表达式,可以是字符,因为字符本质是ASCII码值,为整数。
- default可以放在 case 之前,不过我们通常是把 default ⼦句放在最后处理的。
2.2 switch 语句中的 break
前⾯的代码中,如果我们去掉 case 语句中的 break,会出现什么情况呢?
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
}
return 0;
}
我们发现,3除以3本来余数是0,但是我们发现程序运⾏的结果多了⼀⾏“余数是1”和“余数是2”的打印。这是为什么呢?
原因是 : switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执⾏,有可能执⾏其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。就⽐如上⾯的代码就执⾏了 case 1 和case 2 中的语句。所以在 switch 语句中 break 语句是⾮常重要的,能实现真正的分⽀效果。当然,break 也不是每个 case 语句都得有,这就得根据实际情况来看了。
2.3 switch 语句中的 default
在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊default ⼦句。
switch (expression)
{
case value1: statement
case value2: statement
default: statement
}
switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执行default ⼦句。
例如:打印星期的练习,如果 day 的输⼊不是1~7的值,如果我们要提⽰:输⼊错误,则可以这样完成代码:
#include <stdio.h>
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;
default:
printf("输入错误\n");
break;
}
return 0;
}
2.4 switch 语句中的 case 和 default 的顺序问题
在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实际需求的就可以。
- 未完待续~~