目录
5.4 switch语句中的case和default之间的顺序
1.if语句
if(表达式)
{
执行语句;
}
如果表达式成立,则语句执行,否则语句不执行。
在C语言中,非0为真,0为假。即表达式的结果为0,语句不执行;表达式的结果非0,语句执行。
例如:输入一个整数,判断该数是否能被4整除。
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d",&n);
if(n % 4 == 0)
printf("%d能被4整除\n",n);
return 0;
}
2.if…else…语句
2.1 if…else…语句
if…else…语句一般用在只有两种可能的情况下 。例如一个正整数不是奇数就是偶数,如果我们要判断这个这个数的奇偶性就可使用 if…else… 语句。
if…else…语句的基本语法,如下:
if(表达式)
{
执行语句1;
}
else
{
执行语句2;
}
例:键盘输入一个正整数,判断该数是奇数还是偶数。
#include <stdio.h>
int main()
{
int num = 0;
printf("请输入一个正整数:\n");
scanf("%d",&num);
if(num % 2 == 0)
{
printf("偶数\n");
}
else
{
printf("奇数\n");
}
return 0;
}
2.2 分支中可包含多条语句
默认的在 if 和 else 语句中只控制一条语句,例如:
#include <stdio.h>
int main()
{
int score = 80;
if(score == 90)
printf("我爱学习\n");
printf("学习爱我\n");
printf("\n");
return 0;
}
如上代码,就算if语句中的表达式不成立,“学习爱我”都会输出。
出现上述情况的原因就是if语句默认只能控制一条语句,这里是` printf("我爱学习\n"); ` ,如果要控制多条语句的话就得把要执行的语句用 { } 括起来,else语句控制多条语句也是同理。如:
#include <stdio.h>
int main()
{
int num = 0;
printf("请输入一个整数:\n");
scanf("%d", &num);
if (num % 2 == 0)
{
printf("偶数\n");
printf("能被2整除\n");
}
else
{
printf("奇数\n");
printf("不能被2整除\n");
}
printf("\n");
return 0;
}
3. if…else if…else…语句
3.1 if…else if…else…语句
if…else…语句中,else 可以与另一个 if 语句连用,形成if…else if…else…的多重判断语句。
例如:需求:输入一个成绩,判断成绩的等级,100~90为优秀、89~70为良好、69~60为及格、59以下为不及格。
#include <stdio.h>
int main()
{
int score = 0;
printf("请输入一个成绩:\n");
scanf("%d", &score);
if (score <= 100 && score >= 90)
{
printf("优秀\n");
}
else if (score < 90 && score >= 70)
{
printf("良好\n");
}
else if (score < 70 && score >= 60)
{
printf("及格\n");
}
else if(score < 60 && score >= 0)
{
printf("不及格\n");
}
else
{
printf("输入有误\n");
}
return 0;
}
有了if…else if …else…语句,我们可以实现更多复杂的逻辑判断。
3.2 else 匹配
多个 if …else…连用,else 总是跟最接近的 if 匹配,跟和哪个 if 对齐没关系。例如:
#include <stdio.h>
int main()
{
int score = 79;
if (score >= 80)
if (score == 96)
printf("学无止尽\n");
else
printf("再接再厉\n");
return 0;
}
上述程序的执行结果显然什么都不输出。原因在于 else 语句跟最接近的if匹配,这里的 else 和第二个 if 语句匹配,并且第一个if语句条件不成立,嵌套的 if…else… 也不会执行,所以直接跳过,什么都不打印。
添上 { } 更加清晰 ,程序结果并不改变。
#include <stdio.h>
int main()
{
int score = 79;
if (score >= 80)
{
if (score == 96)
printf("学无止尽\n");
else
printf("再接再厉\n");
}
return 0;
}
如果希望第一个 if 语句 和 else 匹配,可以修改为这样:
#include <stdio.h>
int main()
{
int score = 79;
if (score >= 80)
{
if (score == 96)
printf("学无止尽\n");
}
else
{
printf("再接再厉\n");
}
return 0;
}
注意:有时候加上适当的 { } , 可以让代码更加的清晰,也让别人阅读我们的代码及往后自己查看代码的时候可读性更高一些。
4.运算符
4.1 关系操作符
C语言中用于比较的表达式,称为 “ 关系表达式”,用来对两个数值进行比较的运算符称为“关系运算符”。C语言提供 6 种 关系运算符:
关系运算符 | 含义 |
< | 小于运算符 |
> | 大于运算符 |
>= | 大于等于运算符 |
<= | 小于等于运算符 |
== | 相等运算符 |
!= | 不相等运算符 |
例如:
1 a < b
2 a > b
3 a >= b
4 a <= b
5 a == b
6 a != b
关系表示式的返回值是一个逻辑值,即真或假。在C语言中关系表达式的返回值通常是 0 或 1 ,“ 0 ”表示 “假” , “ 1 ”表示真。例如:2 > 1 的结果是 1,而 1 > 2 的结果是 0。
关系表达式的常用于 if 结构 和 while 结构中。
if ( score == 90 )
{
printf("优秀\n");
}
注意:关系表达式中的 ==(相等运算符) 与 = (赋值运算符)表达的含义是截然不同的,注意不要混淆了,以免影响程序结果。
为了预防上述情况,我们可以这样编写代码,把常量写在等号的左边,变量写在等号的右边。例如:
if (90 == score)
{
printf("优秀\n");
}
这样编写代码,如果 == 误写成 = ,编译器会自动报错。
另外要注意的是:代码中多个关系运算符不宜连用。形如:
a > b > c
这种连续多次使用个于运算符,虽是合法的写法,但是通常不能得到想要结果。不能保证 b 这个值在a 与 c之间,因为关系表达式的运算顺序是从左到右计算,所以实际的执行流程是:
(a > b) > c
上述示例的执行顺序是先判断 a 是否大于 b,返回的结果 和 c 进行比较 。若想判断 b 的值是否介于a 和 c之间,应该使用如下的写法:
a > b && b > c
例如:
#include <stdio.h>
int main(){
int score = 0;
scanf("%d", &score);
if (score <= 100 && score >= 90)
{
printf("优秀\n");
}
return 0;
}
特别注意:关系表达式中的 ==(相等运算符)不能用于比较字符串,C语言中字符串的比较是使用stcmp函数(函数的使用要引入头文件 string.h)。
4.2 逻辑操作符( || , && , !)
逻辑操作符的作用是提供逻辑判断,用于构建更复杂的表达式,它主要有以下三个运算符:
逻辑操作符 | 含义 |
! | 取反运算符(改变单个表达式的真假)。 |
&& | 与运算符,表示”并且“的意思,两侧表达式为真,结果为真,否则为假。 |
|| | 或运算符,表示”或者“的意思,两侧表达式中至少一个为真,结果就作真,否则为假。 |
4.2.1 取反运算符 ( ! )
a | !a |
非0 | 0 |
0 | 1 |
例如:给一个条件为假的话,我们需要输出一个语句,就可以这样写:
#include <stdio.h>
int main()
{
int flag = 0;
if(!flag)
{
printf("hello world\n"); //输出 hello world
}
return 0;
}
4.2.2 与运算符 (&&)
a | b | a && b |
0 | 0 | 0 |
非0 | 非0 | 1 |
0 | 非0 | 0 |
非0 | 0 | 0 |
C语言中的 && 与运算符表示 ”并且“ 的意思,&& 还是一个双目操作符,只有当 && 两侧 表达式都为真时,整个表达式结果才为真,只要有一个为假,整个表达式结果为假。
例如:我们要输入一个成绩判断是否挂科,可以这样表达:
#include <stdio.h>
int main()
{
int score = 0;
printf("请输入一个成绩:\n");
scanf("%d", &score);
if(score >= 60 && score <= 100)
{
printf("不挂科\n");
}
else if(score >= 0 && score < 60)
{
printf("挂科\n");
}
return 0;
}
上述示例中,这里如果要输出”不挂科“的前提是:同时满足score大于等于60且小于等于100.
4.2.3 或运算符(||)
C语言中的 || 或运算符表示 ”或者“ 的意思,|| 还是一个双目操作符,只有当 || 两侧 表达式都为假时,整个表达式结果才为假,只要有一个为真,整个表达式结果为真。
例如:我们要判断一个月份是否有31天,可以这样描述:
#include <stdio.h>
int main()
{
int month = 0;
scanf("%d",&month);
if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
{
printf("%d月有31天\n",month);
}
return 0;
}
4.2.4 短路
C语言逻辑运算符 &&(与运算符) 和 || (或运算符)有个特点,即它总是先对左边的表达式进行计算,然后再对右边的表达式计算,这个顺序是不变的。
如果左边的表达式满足逻辑操作符的条件,不再对右边的表达式进行计算。这种现象称为”短路”。
例如:
if(score >= 90 && score <= 100)
&& 与运算符左边表达式为 `score >= 90`,右边表达式 为`score <= 100`,当左侧表达式的逻辑值为0时,就算不判断右侧表达式,整个表达式的结果也是0(即“不是优秀”)。
再来看 | | 或运算符:
if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
如果 month == 1,则不再判断month 是否等于 3 或 5 或7 或 8 或10 或12,整个表达式的结果也是1(有31天)。故,当 | | 运算符的左侧表达式结果不为 0 ,就不会执行右侧表达式。
形如仅仅判断左侧表达式的结果就可得出整个表达式的结果,且不再执行右侧表达式的运算称作“短路求值”.
4.3 条件操作符
条件操作符也称三目操作符,式子有三个操作数,语法如下:
表达式1 ? 表达式2 : 表达式3;
条件操作符的运算逻辑为:如果表达式1为真,则计算表达式2,运算结果作为整个表达式的结果;如果表达式1为假,则计算表达式3,运算结果作为整个表达式的结果。
例如:需求:键盘录入两个值,计算出最大值。
#include <stdio.h>
int main()
{
int n1 = 0;
int n2 = 0;
scanf("%d %d", &n1 ,&n2);
int max = n1 > n2 ? n1 : n2;
printf("max = %d\n",max);
return 0;
}
5.switch语句
除了 if语句 外,C语句还提供了 switch语句来实现分支结构。
switch语句是一种特殊形式的if…else结构,用来判断条件有多个结果的情况。如果选择太多,if语句使用起来会很繁琐,这时使用switch语句可以简化代码。
switch语句是一个多分支选择语句,且可以支持嵌套。
switch语句的基本格式:
switch(表达式)
{
case 常量1:语句1;
case 常量2:语句2;
default:语句n;
break;
}
上述基本语句,根据表达式不同的值,执行相应的 case 分支。如果找不到匹配的值,则执行default 分支。
注意:switch后的表达式必须是整型表达式。case 后的常量值,必须是整形(包括整型、字符型及枚举)常量表达式。
5.1 if语句和switch语句的对比
例如:输入任意一个整数值,计算除3之后的余数。
使用if语句完成
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
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 num = 0;
scanf("%d", &num);
switch (num % 3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数为1\n");
break;
case 2:
printf("余数为2\n");
break;
}
return 0;
}
使用switch语句需要注意点有:case 和后面的常量值之间必须加空格,其次每一个case语句执行完后,要加上break语句,才可跳出当前switch结构。
5.2 switch语句中的break
前面叙述的代码中,case语句中如果没有break语句,则会出现case穿透现象。
例如:
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
switch (num % 3)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数为1\n");
case 2:
printf("余数为2\n");
}
return 0;
}
这里9除于3的余数应该为0,但程序运行结果却多了两行输出语句,原因在于switch语句是选择结构,只有再switch语句中使用break才可跳出switch结构,如果某一个case语句中没有添加break语句,代码则会继续向下执行,直到遇见break结束,或者程序默认执行到末尾结束。
所以在swtich语句中break语句至关重要,互相配合实现真正的分支效果。
但是不是每个case语句中都得加break语句,根据实际情况而定。
例如:输入一个1~7的数字,打印对应的星期数。输入1,打印星期一;输入7,打印星期日
#include <stdio.h>
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;
}
如果需求发生变化,变为
输入1 ~ 5,输出语句“工作日”; 输入6~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;
}
return 0;
}
通过上面两种不同的需求,相信大家能够正确使用break语句以及认识case穿透现象。
5.3 switch语句中的default
在使用 switch语句时,我们经常遇到switch后的表达式的值无法和case后的常量值匹配,为了让代码可读性更高一写,我们可以在switch语句中加上default子句。
switch(表达式)
{
case 常量1:语句1;
case 常量2:语句2;
default:语句n;
break;
}
例如前面打印的星期数,还可以这样写:
#include <stdio.h>
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;
default:printf("输入有误\n");
break;
}
return 0;
}
5.4 switch语句中的case和default之间的顺序
在switch语句中 case语句和default 之间没有顺序要求,default语句并不是只能放在最后。但通常我们习惯把default语句放在最后处理。
5.5 switch语句注意事项:
1.default语句 在末尾时它下面的break可省略,但通常会把break加上。
2.case后面的表达式只能常量,不能是变量
3.注意case语句中如果缺少break语句会出现case穿透现象
4.switch语句执行到break结束,亦或者程序执行到末尾结束。