C语⾔是结构化的程序设计语⾔,这⾥的结构指的是
顺序结构、选择结构、循环结构
,我们可以使⽤
if 、 switch
实现
分⽀结构
,使⽤
for 、 while 、 do while
实现
循环结构
。
1.if语句
1.if
if语句的语法如下
表达式成立(为真),则语句执行。表达式不成立(为假),则语句不执行。
在C语言中0为假,非0为真。也就是说表达式的结果为0则语句不执行,表达式的结果不为0则语句执行。
如上图,输入的5使得if()中的表达式成立,则后面的语句得以执行。(需注意if()后没有;)
2.else
如上述例子,只有在输入的数为奇数时才会显示此数为奇数,如何使得我们输入的数为偶数时也能够得到此数是偶数这么一个结果呢?
此时我们便需要使用到if......else.....语句了
此时输入10后便也能得到10是偶数这么一个结果了。再举如下例子加深理解
此时输入19便显示成年。
3.分支中包含多条语句
默认在
if
和
else
语句中默认都只控制⼀条语句。
可以发现无论输入是偶数还是奇数,world一直都会被执行。也就是说if只能控制一条语句,else也同理。那么如何使得if和else能控制两条及以上的语句呢?我们可以使用
{}将多条语句组成一条复合语句,这样我们便能控制多条语句。
由此只有在输入奇数时world也不会被执行打印出来!
4.嵌套if
在使用if....else....语句时我们可以通过在if或else后与其他if语句连用构成多重判断。
如上图我们通过在else后与其他if语句连用(即嵌套在else中)来判断输入的数是0还是正负数这一三重判断问题
如上图我们又通过将if语句嵌套入if后的复合语句中完成对输入的数是奇数偶数还是负数的三重判断问题。
有了嵌套if语句,我们可以完成更多复杂逻辑的判断
为了美观,嵌套if语句也可以如下写法
5.悬空else问题
如果有多个
if
和
else
,可以记住这样⼀条规则,
else 总是跟最接近的 if 匹配
可能很难理解为什么程序执行后什么都没打印,但根据上述规则并将else位置稍微调整如下即可很好地理解悬空else问题
那么为了更为直观地了解这一规则,可以如下加上
{}
如果希望else与第一个if匹配我们也可如下操作
如果希望更好地规范自己的代码,可以参考《高质量C/C++编程指南》。
2.关系操作符(操作符也称运算符)
C 语⾔⽤于⽐较的表达式,称为 “关系表达式”,
⾥⾯使⽤的运算符就称
为“关系运算符”
•
> ⼤于运算符
•
<
⼩于运算符
•
>=
⼤于等于运算符
•
<=
⼩于等于运算符
•
==
相等运算符
•
!=
不相等运算符
关系表达式通常返回 0 或 1
,表⽰真假。C语言中0表示假,所有非0值都表示真。由此我们可知20>10返回1,20<10返回0。关系表达式常⽤于
if
或
while
结构。
注意!==为相等运算符,而=为赋值运算符!
上图中第二张图片中由于a=5这一赋值表达式的整体结果为5是非零值为真,所以程序执行打印出hehe,由这两张图我们能很好的理解==与=的区别。而
为了防止我们粗心少打=,我们在比较变量与另一常量的关系时可以
将常量放在关系符的左边,这样如果我们少打一个=时机器便会报错提醒我们!如下图
此外我们还需要注意的一个错误是:多个关系运算符不宜连用!
此图中连用两个小于运算符,出现a<b<c这一关系式,虽然程序并不报错,但如下图
此图中我们改变b=4,可以得到a<b<c这一关系式并不成立,但是依然得到和上图一样的结果。
其原理主要是(a<b)<c,a<b这一关系式为假则返回值为0,0再与c比较由于0<c这一关系式为真返回值为1则if后的语句得以执行。
得知这一错误后我们又应该如何正确来表示我们原本想表达的意思呢?
此时我们引入一个新的符号
&&(表示
并且)
如图写法后在未满足a<b时程序将不会执行if后的语句,这便是正确的方式!
由此例我们能加深对
&&的理解
3.条件操作符
条件操作符也叫
三⽬操作符(唯一一个三目操作符)
,需要接受三个操作数的,形式如下
条件操作符的
计算逻辑
是:如果 exp1 为真, exp2 计算,exp3不计算,计算的结果是整个表达式的结果;如果exp1 为假,
exp3
计算,exp2不计算,计算的结果是整个表达式的结果。
如上例子可以很好地运用条件操作符解决较为简单的逻辑问题
4.逻辑操作符:&& , || , !
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,具体功能如下:
• ! :逻辑取反运算符(改变单个表达式的真假)。
• && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
• || :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
1.!(逻辑取反运算符)
此图可以很清晰地了解关于逻辑取反运算符背后的逻辑反操作
当我们取得num=0时为假,要使得程序执行if后的语句即可通过逻辑取反运算符(!num)表示真来使得if后的语句得以执行。
2.&&(与运算符)
在上文中我们也了解到&&的意思是并且,属于双目操作符,如下图为与逻辑
与操作符的使用方式为(a&&b),只有当&&两边的表达式都为真时整个表达式才为真,只要两边表达式有一个为假,那么整个表达式也为假。
如上述例子中我们可以更深入地了解&&的功能与应用场景,通过限定春季月份在3到5月份之间时,当我们输入的4时此时显示为春天,表达的意思是只有当月份大于等于3小于等于5时才为春天。(个人这也体现了将口语转化为计算机语言的美感)
3.||(或运算符)
||便是或运算符,为双目操作符,使用的方法为(a||b),只要当或运算符两边的表达式中有一个表达式为真则整个表达式为真,只有当两边表达式都为假时整个表达式才为假,以下为或逻辑:
如上图无论只要我们输入1,2,12中的任何一个都可执行if中的语句显示出冬天。
4.深入了解&&与||所构成的更为复杂的逻辑问题
通过对逻辑与和逻辑或的了解,灵活运用与操作符和或操作符将代码一步一步缩为一个较为复杂的逻辑判断,通过这样一个例子帮助我们更加深入了解与操作符和或操作符更灵活的使用方式。
5.短路
C语言逻辑运算符有个特点:总是先对左侧的表达式求值再对右侧的表达式求值。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值,这种情况称为
“短路”
如上图可以帮助我们了解&&和||两个逻辑操作符
短路求值的情况
如上图由于a++为后置++,则先使用a=0后再+1,此时a=0为假则此时可判断整个表达式均为假,则i=0,且由于短路后续的++b以及d++都不再运算
此例也能帮助我们更深入了解短路时代码的具体运行细节!