C语言是一门结构化的程序设计语言,其中将实现的结构分为了顺序,选择和循环三类,顺序结构就是按语句顺序实现程序,这里不多讲,本次内容我们着重介绍C语言的选择结构,也就是分支语句,以及相关会用到的知识。
一、if语句
- if语句使用格式如下:
if (表达式)
语句
表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏,C语言中0为假,非0为真
接下来我们举个例子就懂了,我们试着来实现:输入一个整数,判断是否为奇数,首先判断方法就是让这个整数模2,如果返回1,那么它就是一个奇数,示例如下:
- else
如果⼀个数不是奇数,那就是偶数了,如果任意⼀个整数,我们要清楚的判断是奇数还是偶数怎么表⽰呢?就要用上else(其他的情况),在这里也可以翻译为否则,写法如下:
if (表达式)
语句1
else
具体示例:其含义为,输入一个整数,判断是否为奇数,是奇数就打印,否则为偶数,再打印
- 分支语句中包含多条语句:
默认if和else都只能控制一条语句,比如:
可以发现,虽然输入的年龄小于18,可是还是会打印“可以谈恋爱了”,但是不会打印“成年了”,这就是上面说的if默认只能控制一条语句,那怎么可以让它控制多条语句呢,只需要把要一起控制的语句用大括号括起,如图:
这下输入15就不会打印“可以谈恋爱了”。同理,如果else后想要控制多条语句,也要用大括号括起。
- 嵌套if:
在 if else 语句中,else 可以与另⼀个 if 语句连⽤,构成多重判断。⽐如:要求输⼊⼀个整数,判断输⼊的整数是0,还是正数或者负数。请看如下代码:
上面的if语句就嵌套在else语句中。再比如实现这样的程序:输⼊⼀个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出:⾮正数,如图:
如上就是对if语句进行了嵌套。
if语句练习
输⼊⼀个⼈的年龄
如果年龄<18岁,打印"少年"
如果年龄在18岁⾄44岁打印"⻘年"
如果年龄在45岁⾄59岁打印"中⽼年"
如果年龄在60岁⾄89岁打印"⽼年"
如果90岁及以上打印"⽼寿星"
答案放在本文最下方
二、关系操作符
C 语⾔⽤于⽐较的表达式,称为 “关系表达式”,⾥⾯使⽤的运算符就称为“关系运算符”,主要有下⾯6个
-
运算符分类
• >是大于运算符
• < ⼩于运算符
• >= ⼤于等于运算符
• <= ⼩于等于运算符
• == 相等运算符
• != 不相年龄在表达等运算符 -
关系表达式返回值:一般返回逻辑值,默认返回0表示假,返回1表示真,也就是如果表达式成立返回1,不成立返回0。要注意的一点是:C语言中0是假,非0为真,这里只是用1表示真,并不表示真就是1
-
注意事项:
(1)不要把相等操作符==写成了赋值操作符=,容易出现逻辑错误,比如if( n = 3),原本想判断n是否等于3,现在的含义是把3赋值给n,是永远为真的条件
(2)多个关系符不能连用,比如想表达年龄在18到30岁之间时,不能写成18=<age<=30,编译器会报错,要写成age >=18 && age <=30,在后面的逻辑操作符会详细讲到
三、条件操作符
条件操作符属于三目操作符,也是C语言唯一一个三目操作符,需要用三个操作数,大致用法是:
条件 ?表达式1 : 表达式2,如果条件成立,即条件为真,那么执行表达式1,条件不成立,即条件为假,执行表达式2,比如将如下代码改造为使用条件操作符的表达式:
解析:b后面用的赋值操作符,就是把表达式a >5 ? 3 : -3的结果赋给b,如果输入的值大于5,那么就执行表达式1,结果就为3,如果输入的值小于等于5,那么执行表达式2,结果就为-3。
从该例子可以看出,一些简单的条件判断就可以使用条件操作符,会比if语句简单一些
条件操作符练习
使⽤条件表达式实现找两个数中较⼤值
答案在本文最后
四、逻辑操作符
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符
• ! :逻辑取反运算符(改变单个表达式的真假)
• && :逻辑与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)
• || :逻辑或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)
接下来我们进行一一介绍:
-
逻辑取反操作符!:可以将原表达式的逻辑值取反,比如原表达式为真,那么取反后就为假,原表达式为假,取反后为真,例如:
解析:a的值为10,b的值为20,a>b,返回的就是假,然后取反过后就是真,那么以上表达式!(a>b)返回值就是真,那么满足了if语句的判断,就在屏幕上打印了“hello world” -
逻辑与操作符&&:它的意思就是并且,比如表达式1 && 表达式2,它的含义就是既要满足表达式1,也要满足表达式2,即两个表达式同时为真,结果才为真,比如我们想表达3月到5月是春天,那么月份必须满足大于等于3月,并且小于等于5月,否则就不满足题意,举例为:
解析:我们输入的月份必须必须满足大于等于3月,并且小于等于5月,即表达式1和2都要为真才行,如果有一个为假那么就不会打印“春天”,故我们可以总结出规律:
• 真 && 真结果为真
• 真 && 假结果为假
• 假 && 真结果为假
• 假 && 假结果为假
- 逻辑或操作符||:它的含义是或者,比如表达式1 || 表达式2,只需要其中一个表达式满足条件,即其中一个表达式为真,那么结果为真,比如同样表达3月到5月之间是春天,使用逻辑或表达如下:
解析:这里有三个条件,要么月份等于3,要么月份等于4,要么月份等于5,只要其中一个成立就会打印春天,只有都不满足这三个条件的月份才不会打印春天,即只有所有表达式为假,才会返回假,其余都返回真,可以总结规律如下:
• 真 || 真结果为真
• 真 || 假结果为真
• 假 || 真结果为真
• 假 || 假结果为假
逻辑操作符练习
输⼊⼀个年份year,判断year是否是闰年
闰年判断的规则:
- 能被4整除并且不能被100整除是闰年
- 能被400整除是闰年
答案在文末
五、switch语句
除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。switch 语句是⼀种特殊形式的 if…else 结构,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式,特点就是大部分情况需要知道表达式准确的返回值,其语法为:
switch (表达式)
{
case 值1: statement
case 值2: statement
default: statement
}
上⾯代码中,根据表达式 expression 不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,
就执⾏ default 分⽀
-
switch语句和if语句对比:比如要实现:输⼊任意⼀个整数值,计算除2之后的余数,使用if语句为:
使用Switch语句为:
上述的代码中,我们要注意的点有:
(1)case 和后边的数字之间必须有空格
(2)每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。 -
Switch语句中的break:
如果前面的代码我们去掉break会怎么样呢?
我们会发现原本余数是0,结果还继续打印了余数是1,原因是 switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执⾏,有可能执⾏其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束。就⽐如上⾯的代码就执⾏了case 0 的语句,还执行了case 1 中的语句 -
Switch语句中的default:
如果我们输入的值不在我们的case中,那么我们就会用到default,用来排除其他情况,比如:输⼊⼀个1~7的数字,打印对应的星期⼏,例如输入1就打印星期一,代码如下:
试想如果用户没有按要求输入1~7的数字呢?此时就可以使用default,比如:
此时如果用户输入1~7之外的数字,也就是不在case中的数字,就会显示输入错误,相当于一个提示信息 -
default的顺序:
不少人认为default必须放在最后,实际上default和case语句没有严格的顺序要求,只不过习惯将default放在最后,实际上是可以放在前面,甚至放在第一个也可以
Switch语句练习
如果上述需求发⽣变化,变为:
- 输⼊1~5,输出的是“⼯作⽇”
- 输⼊6~7,输出“休息⽇”
- 如果输入其他数字,那么打印输入错误
如何简便地将要求完成
答案在本文末尾
六、答案
-
if语句练习答案:
-
条件操作符练习答案:
-
逻辑操作符练习答案:
-
Switch语句练习答案:
这里我们利用了Switch语句中如果没有break,那么从对应case进入,并且实现对应语句后,并不会直接停下来,而是继续执行代码。输入1,2,3,4,5都会打印工作日,那么不如直接将打印工作日放在case 5,然后用break结束,假设从case 1进入,什么也没有,就会往下面继续执行,知道碰见了case 5,打印了工作日后,break停止了,输入2~4也是同理。根据这个逻辑,输入6,7都会打印休息日,就直接把打印休息日放在case 7,然后用break结束,原理同上。
由此可见,我们可以根据需求,灵活使用break,不能太呆板
如果有什么疑问,欢迎在评论区留言。