if语句
前面,我们讲过C语言是结构化程序语言,支持三种结构(顺序,选择,循环)。C语言中规定了很多语法去实现这三种结构。if语句
就是选择结构的组成一员。
- if语句的格式:
if (表达式)
语句;
//又或者
if (表达式)
{
语句1;
语句2;
.
.
.
语句n;
}
-
if语句的判断逻辑:
-
if语句的结构:英文单词
if:如果
。当if
里面的表达式成立(为真)时,它就执行下面的语句,反之当不成立时(为假),它就不执行下面的语句。前面,咱们讲过,C语言中0为假,非0为真。if
控制的语句是有范围的,每个if
语句只能控制一条语句,如代码所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
if (5 < 6) //条件成立
printf("hhhhh"); //成功打印
return 0;
}
结果运行图:
我们讲了if
的表达式条件成立就执行程序,反之不成立就不执行,也就是0为假,非0即真,我在里面放入非0的数字它也可以执行,如代码所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
if (5)
printf("hhhhh"); //打印信息
if (0)
printf("hhhhh"); //不打印信息
return 0;
}
结果运行图:
- else的介绍: 单词意思:
别的,其它的
。就是对if语句
的另一个情况补充,就是当if语句的情况不成立时,再过来判断else的情况,即if...else...
格式。它俩是两种独立的情况,也就是说只有一个情况会实现,所以if...else...
就是一条语句。else
的结构和对语句的控制范围和if一样。进行代码展示:
写一个程序,输入一个正整数,判断它是不是偶数,如果是,就显示偶数,否则就显示奇数。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a % 2 == 0)
printf("a是偶数");
else
printf("a是奇数");
return 0;
}
结果运行图:
if...else if...else...
的介绍: 这种语法又拓展了if语句
的情况。格式如下:
if (表达式)
语句;
else if (表达式)
语句;
. //之间可有多个 if else 语句
.
.
else
语句;
其实这个语句本质上就是if语句的嵌套,我们先写个程序:
// 写一个程序,当我们输入一整数时,先判断它是否为正数,再然后判断奇偶性。人。
//第一种程序的写法:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a<0)
printf("a是负数");
else
{
if(a%2==0)
printf("a是偶数");
else
printf("a是奇数");
}
return 0;
}
// 第二种程序的写法:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a<0)
printf("a是负数");
else if(a%2==0)
printf("a是偶数");
else
printf("a是奇数");
return 0;
}
结果运行对比图:
通过对比图,各位就能很好理解它们就是嵌套的意思了吧。
- 注意:else在C语言中,有个默认的规定——当else遇到多个if语句的时候,它会与最近的if语句组合。 如代码所示(可以猜一下输出的结果):
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 10;
if (a<0)
if(b==10)
printf("hhhh");
else
printf("aaaaa");
return 0;
}
结果运行图:
表面上应该打印的信息是"aaaaaa"
,但结果却不是,就是因为当else遇到多个if语句的时候,它会就近原则。因为当if (a<0)
不成立时,后面所有的语句都不执行,这里的if (b==10)....else...
。就是一条语句(上面我们讲了),所以它属于if (a<0)
的控制范围内,所以它不成立,后面就不执行了。
关系操作符
C语言中用于比较关系的表达式叫做:关系表达式。其中参与运算的操作符叫做:关系操作符。常见的关系操作符如下所示:
> 大于
< 小于
>= 大于等于
<= 小于等于
= = 相等
!= 不等于
进行简单的举例子:
a > b;
a < b;
a >= b;
a <= b;
a == b;
a != b;
对于关系操作符来讲,它是有返回值的。当表达式成立就返回1(非0为真),表达式不成立就返回0(0为假),进行代码展示;
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10;
int b = 4;
int c = (a > b);
int d = (a < b);
printf("%d\n", c); //条件为真,返回1
printf("%d\n", d); //条件为假,返回0
return 0;
}
结果运行图:
关系操作符不适合连用,即 a < b< c
。关系操作符连用时,会从左向右依次运算,首先a和b
进行比较,比较的结果为0或1(因为有返回值),然后会拿返回值继续与b
进行运算。这就会导致最终的结果与我们的预期不符。进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10;
int b = 4;
int c = 9;
if(a>b>c) //a>b成立,返回1.返回值1继续与9比较,1小于9,不成立
printf("%d\n", c); //所以不执行本语句
return 0;
}
结果运行图:
条件操作符
这个条件操作符也叫三目操作符,比较冷门(它可以被某些程序块所替代)。直接给大家上格式(表达式1 ? 表达式2 :表达式3
):
表达式1 ? 表达式2 :表达式3
// 咱们先写个普通程序(不用条件操作符)
// 程序1
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10;
int b = 4;
int c = 0;
if (a > b)
{
c = 6;
printf("%d\n", c);
}
else
{
c = 8;
printf("%d\n", c);
}
return 0;
}
//程序2
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10;
int b = 4;
int c = a < b ? a : b; //int c = (a < b ? a : b); 这样写也OK
printf("%d\n", c);
return 0;
}
运行结果图:
- 对条件操作符的运算解读(
表达式1 ? 表达式2 :表达式3
):表达式1成立,就执行表达式2,否则就执行表达式3。
逻辑操作符:&&,||,!
逻辑操作符是针对于表达式而言的。
- &&逻辑与操作符:&&逻辑与具有并且的作用,就是当两个条件都成立时(两个都为真,最终结果才为真),整体才成立。但是,有一个条件不成立时(有一个条件为假,最终结果就为假),整体就不成立。如图,逻辑关系图所示:
在前面,我们讲过关系操作符不宜连用。比如,a < b < c
。这个时候,我们可以用逻辑与操作符进行修改,比如,a < b && b < c
。进行代码展示:
// 写一个程序,判断0~10岁为少年,11~25岁为青年,26~45岁为壮年,46~60为中年,61~100岁为老年。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a > 0 && a <= 10)
printf("少年");
else if(a>=11&&a<=25)
printf("青年");
else if (a>=26&&a<=45)
printf("壮年");
else if (a>=46&&a<=60)
printf("中年");
else
printf("老年");
return 0;
}
结果运行图:
&&就很好的规避了关系操作符不宜连用的问题,而且逻辑清晰,代码格式美观,可读性很高。
- ||逻辑或操作符:
||逻辑或操作符的逻辑与&&相反,当两个表达式的结果都为假时,整体的结果才为假。有一个表达式的结果为真,整体结果就为真。如图,逻辑关系图所示:
接下来,我们写一个程序:
// 我们写一个判断闰年和平年的程序,当我们输入年份,能够自动判断平年和闰年。
//闰年:能被4整除且不能被100整除,或者能被400整除。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if ((a % 4 == 0 && a % 100 != 0) || (a % 400 == 0))
printf("闰年");
else
printf("平年");
return 0;
}
运行结果图:
- !逻辑取反操作符:
这玩意儿就跟变魔术似的,假变为真,真变为假。比如,表达式1不成立
,导致的最终结果为假。我们可以这样! 表达式1不成立==表达式1成立
。如图,逻辑关系图: - &&和||的短路现象:当我们有多个&&或||时,整体就存在短路现象,它会从左向右依次运算。如代码所示:
int a = 10;
int b = 8;
a < b && a++ && b-- ; //a < b不成立,就会用返回值0(为假)进行后面的运算。
//咱们讲过,&&一假,就全为假,所以有一个为假,就整体为假,后面就不用看了。
//只有第一个条件为真,才向后继续判断。
a > b || a++ || b-- ; //a > b 成立,就会用返回值1(为真)进行后面的运算。
//咱们讲过,||一真,就全为真,所以有一个为真,就整体为真,后面就不用看了。
//只有第一个条件为假,才向后继续判断。
大家猜一下,下面的运算结果:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
//i = a++||++b||d++; 大家可以自行试试这个||的运算结果
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
return 0;
}
运行结果图:
不知道你猜对了没有!!!
switch语句
switch语句和if语句一样,也是选择结构中的一种语法。 结构如下:
switch (表达式)
{
case 常量值1: 语句 1;
case 常量值2: 语句 2;
.
.
.
case 常量值n; 语句 n;
default : 语句 ;
}
switch语句
就是if...else...语句
的另一种形式。根据表达式的结果,来进行判断符合哪一个语句,如果都不符合的话,就执行default语句。进行代码展示;
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:
printf("hhhh\n");
case 2:
printf("aaaa\n");
}
return 0;
}
结果运行图:
前面,我们见过了switch语句得到原理。按理讲,我们输入1
,就会执行case 1的语句
,输入2
,就会执行case 2
。为什么会出现这样的结果呢?原因就是我们少了一个break(打破)
,它是一个关键字,具有终止(打破)程序的作用,没有它的话,程序就会继续执行剩下的case语句。进行代码修改:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:
printf("hhhh\n");
break;
case 2:
printf("aaaa\n");
break;
}
return 0;
}
结果运行图:
在这里我是想说,break不是一定要用(并不是有case就要有break),要根据具体的程序来使用。 我们来写个程序:
// 当我们输入1~5表示工作日,6~7表示休息日。
// 程序 1
#define _CRT_SECURE_NO_WARNINGS 1
#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;
}
return 0;
}
//程序 2
#define _CRT_SECURE_NO_WARNINGS 1
#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;
}
return 0;
}
结果运行图:
default语句
也不是必须品,也是要根据具体程序来用的,它不一定要放后面,放前面也是OK的。进行代码展示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
switch (a)
{
default:
printf("请输入1~7的数字");
break;
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日");
break;
case 6:
case 7:
printf("休息日");
break;
}
return 0;
}
结果运行图:
对于switch语句
的使用是很灵活的,大家不要被模板公式所禁锢!!!(case后面不一定要加break,default也不是必须的,也不一定要放末尾)
来个彩蛋放松一下!!!
https://www.bilibili.com/video/BV1jAigeuEm3/?spm_id_from=333.788.recommend_more_video.1&vd_source=7d0d6d43e38f977d947fffdf92c1dfad
每章一句:“人因梦想而伟大,因坚持梦想而成长”
,感谢你能看到这里,点赞+关注+收藏是对我最大的鼓励,咱们下期见!!!