【C语言】分支和循环(上)
- 1、if语句
- 1.2 else
- 1.3分支中包含多条语句
- 1.4嵌套if
- 1.5悬空else问题
- 2、关系操作符
- 3、条件操作符
- 4、逻辑操作符:与、或、非(取反)(&&,||,!)
- 4.1逻辑取反运算符
- 4.2逻辑 与 运算符
- 4.3逻辑或操作符
前言:C语言是一种结构化的设计语言,这里所指的结果包括:顺序结构、选择结构和循环结构。
接下来将介绍分支和循环结构,我们可以使用if、switch来实现分支结构,使用for、while、do while实现循环结构。
1、if语句
if语句的语法形式如下代码所示:
if( 表达式 )语句
表达式如果为真,则下面的语句执行,如果为假,则语句不执行。
在C语言中,0为假(不成立),语句不执行;**非0表示真(成立)**时,语句执行。
eg:输入一个整数,判断是的为奇数:
if语句原理图如下:
1.2 else
接上面例子所述,如果一个数不是奇数,那么就是偶数,如果任意一个整数,要怎么判断是奇数还是偶数呢?
这里就可以在if语句后面加上else,构成if…else语句,语法形式如下:
if( 表达式 )语句1
else语句2
eg1:输入一个整数,判断是否为奇数,如果是奇数打印是奇数,否则打印偶数:
eg2:输入一个年龄,≥18就输出:成年,否则输出:未成年:
1.3分支中包含多条语句
默认在if和else语句都只控制一条语句:
从上述示例中可以看出,不管是成年(age>=18)或者未成年(age<18),都会打印出“可以赚钱养家糊口了”。说明if语句只能控制一条语句,即:printf(“成年\n”);
这是因为if语句只能控制一条语句,如果if语句为真,则打印成年,if语句为假,则不打印;对于printf(“可以赚钱养家糊口了\n”);是独立于if存在的,不管if语句的条件是真还是假。如果if语句需要同时控制两条语句该怎么实现呢?就需要使用{}将代码括起来,else后也可以跟上大括号。如下代码所示:
1.4嵌套if
在if else语句中,else可以与另一个if语句连用,构成多重判断。
eg:要求输入一个整数,判断输入的整数是0,还是正数或者负数。请看代码演示:
这里的if相当于嵌套在else语句中,形成了嵌套结构。
eg:输入一个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:非正数。请看下列代码:
以上就是嵌套if语句的语法,有了嵌套if语句,就可以完成更多复杂逻辑的判断。
练习:
输⼊⼀个⼈的年龄
如果年龄<18岁,打印"少年"
如果年龄在18岁⾄44岁打印"⻘年"
如果年龄在45岁⾄59岁打印"中⽼年"
如果年龄在60岁⾄89岁打印"⽼年"
如果90岁及以上打印"⽼寿星"
1.5悬空else问题
如果有多个if和else的时候,else总是跟最接近的if匹配。
下面以代码举例:
#include <stdio.h>
int main()
{int a = 0;int b = 5;if (a == 1)if (b == 5)printf("hello world.\n");elseprintf("good afternoon.\n");return 0;
}
观察上述代码,思考它输出的是什么呢?
我们在初学的时候,会有这样的思路:if先判断a是否等于1,代码中a不等于1,那么就执行else语句,最后得出的结果是:good afternoon.
那我们看看运行代码起来会得到什么结果呢?
结果得到的是什么也不输出。这是为什么呢?
这就是本小节介绍的悬空else问题。如果有多个if和else,可以记住这样一条规则:else总是跟最接近的if匹配。
代码解析:上述代码让else和第一个if语句对齐,让我们以为else是和第一个if匹配。当第一个if不成立的时候,自然想到的就是执行else语句,打印good afternoon,但实际上else是和第二个if进行匹配的,这样后边的if…else语句是嵌套在第一个if语句中的,如果第一个if语句不成立,那么嵌套的if和else就没有机会执行,最终什么也打印不出来。
这个时候如果加上大括号{ }就会使得代码更加清楚易于理解:
#include <stdio.h>
int main()
{int a = 0;int b = 5;if (a == 1){if (b == 5)printf("hello world.\n");elseprintf("good afternoon.\n");}return 0;
}
如果我们希望else确实和第一个if匹配,可以修改成如下代码:
#include <stdio.h>
int main()
{int a = 0;int b = 5;if (a == 1){if (b == 5)printf("hello world.\n");}else{printf("good afternoon.\n");}return 0;
}
只要带上适当的大括号,代码的逻辑就会更加清晰,所以写代码的时候可以注意大括号的使用,使得代码可读性更高。
2、关系操作符
C语言用于比较的表达式,称为关系表达式,使用的运算符就称为关系操作符。
下面介绍6个基本常用的操作符:
> 大于运算符 < 小于运算符 >= 大于等于运算符 <= 小于等于运算符 == 相等运算符 != 不相等运算符
下面举例理解:
- m=n
- m!=n
- m<n
- m>n
- m<=n
- m>=n
关系表达式通常返回0或1,表示真或者假。
C语言中,0表示假,所有非0值表示真(关系表达式中用1表示真)。eg:27>25返回1,19>20返回0。
关系表达式中常常用于if和while结构来判断真假进行循环。
#include <stdio.h>
int main()
{int num = 0;scanf("%d",&num);if(num % 5 == 0)//关系表达式运用在if语句中printf("%d是5的倍数\n",num);return 0;
注意:相等运算符 ==与赋值运算符 = 是两个不一样的运算符,不要混淆。有时候,可能会不小心将相等运算符写成赋值运算符=,虽然可以运行,但得不到我们想要的效果。
if(x =5)
上述示例中,我们原本是想判断x是否与5相等,但是不小心写成了x=5.这个时候式子表示对变量x赋值为5,它的返回值为5(为真),所以if判断总是为真。
为了防止这种错误出现,我们可以将变量写在等号的右边。
if(5 =x)
如果把==写成了=的时候编译器就会报错。
在关系操作表达式中,多个关系运算符不宜连用。
eg:错误示范
a>b>c
解析上面的示范:
eg:输入一个年龄,如果年龄在18-36岁之间,我们称为青年。
3、条件操作符
条件操作符也叫三目操作符,需要接受三个操作数的,形式如下:
exp1?exp2:exp3
条件操作符的计算逻辑是:如果exp1为真,则计算exp2,计算的结果就是整个表达式的结果。如果exp1为假,则计算exp3,计算的结果就是整个表达式的结果。
eg:使用条件操作符表示下列代码的逻辑:
参考解答:
eg2:使用条件表达式实现找两个数中的较大值:
4、逻辑操作符:与、或、非(取反)(&&,||,!)
逻辑运算符提供逻辑判断功能,用于构建更复杂的表达式,主要有下面三个运算符:
- !:逻辑取反运算符(改变单个表达式的真假)
- &&:逻辑与运算符,表示并且的意思(全真为真,其余全假)
- ||:逻辑或运算符,就是或者的意思(两侧至少有一个为真,则整个为真)
注意:C语言中,非0表示真,0表示假
4.1逻辑取反运算符
eg:有一个变量flag,如果flag为假(0),要做什么事情,可以写如下代码:
如果flag为真,!flag为假,相反flag为假,!flag为真。
所以上述flag为假,取反后为真,执行if语句的代码。
4.2逻辑 与 运算符
&&就是与运算符,也是并且的意思,&&是一个双目操作符,使用的方式是a&&b,&&两边的表达式都是真的时候,整个表达式为真,只要有一个是假,则为假。
如果我们要表示6-8月是夏天,代码如何实现呢?
这里的month既要大于等于6,又要小于等于8,且同时必须满足。
4.3逻辑或操作符
||就是或运算符,也就是或者的意思,||也是一个双目操作符,使用的方式是a||b,||两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
比如:我们说一年中月份是12月或者1月或者2月是冬天,那么我们怎么使用代码体现呢?