c语言:if语句和操作符

1.if语句

c语言是结构化的程序设计语言,这里的结构指的是顺序结构,选择结构,循环结构,c语言是能够实现这三种结构的,我们可以使用if,switch实现分支结构,使用for,while,do while实现循环结构。此篇文章只介绍if语句和switch语句,循环语句在下一篇博客中介绍,好了,正文开始。

1.1 if

if语句的语法形式如下:

f0af6fc0b6dd490d8db95e2a71459587.png

如果表达式成立(真),则语句执行,如果表达式不成立(假),则语句不执行 

在c语言中,0为假,非0表示为真,也就是表达式的结果如果是0,则语句不执行,表达式的结果如果是非0,则语句执行。

例子:输入一个整数,判断是否为奇数

1aea8c39ac0a4b14a9cff424008cd267.png

303ad8b947d241e08a5c0fde61e41dc9.jpeg

1.2 else

按照上面的例子,我们输入的数字不是奇数就是偶数,我们要清楚的判断奇数还是偶数并如何表达出来呢?

这里就需要if...else...语句了,语法形式如下:

e165e8fee1d84a48ae0f710177f386c4.png

例子:输入一个整数,判断是否为奇数,如果是奇数打印奇数,否则打印偶数。

dd581b43d5894af8ab1615c1ab23e769.png

1.3分支中包含多条语句

默认在if和else语句中默认都只控制一条语句,比如;

23462ad97095488f80c0783b080369ab.png

f19b85aa4a0a4e44a0f45e6d7a10fb45.png

上面的代码,你会发现无论输入小于18的数还是大于18的数“可以谈恋爱了”都会打印在屏幕上。

这是因为if语句只能控制一条语句,就是:

printf("成年了\n")

 if语句为真,则打印成年了,反之不打印,而对于:

printf("可以谈恋爱了\n")

此语句是独立存在的,不管if语句的条件的真假,都会被执行,那如果我们要if语句同时控制2条或多条语句,怎么办呢?那就该使用{}将代码括进来,else同理。

4cf1ab86c32549daade38b36ff1bac42.png

1.4 嵌套if

在if...else...语句中,else可以与另一个if语句连用,构成多重判断。

比如:要求输入一个整数,判断输入的整数是0,还是正数或者负数,如下:

d20d1fc0c1bb49daa4c10bcb685bf52d.png

再比如,输入一个整数,如果是正数,在判断奇数还是偶数,并输出;如果不是正数则输出:非正数。

3d8092d876d9433b844d590d91e42e01.png

1.5悬空else问题

如果有多个if和else,有这样一条规则,else总是与最接近的if匹配。如下:

2c37ccaaf2fc4d9eab00ee3307bc289f.png

运行的结果是什么?肯定有很多人判断a是0,不等于1,那就执行else句子,打印haha

但是当你运行代码,输出的结果是:啥都不输出。

什么原因呢?

这就是悬空else的问题 ,果有多个if和else,有这样一条规则,else总是与最接近的if匹配。

上面的代码,让 else和第一个if对齐,让我们以为else是和第一个if匹配的,当if语句不成立的时候,自然想到执行else语句,打印haha,但实际上else是和第二个if进行匹配的,这样后面的if...else...语句是嵌套在第一个if语句中的,如果第一个if语句就不成立,后面就不会执行了,最终什么都不会打印。

如果代码改成这样就容易理解了。

65dec76e9684457e8f1b684c2d30b260.png

2.关系操作符

c语言中用于比较的表达式,称为“关系表达式”,里面使用的运算符就称为“关系表达式”,主要有以下6个。

> ⼤于运算符
 < ⼩于运算符
>= ⼤于等于运算符
<= ⼩于等于运算符
== 相等运算符
!= 不相等运算符
关系表达式通常返回0或1,表示真假。
在c语言中,0表示假,所有非0值表示真,比如10>5返回1,5>10返回0。
关系表达式常用于if或while结构。
注意:相等运算符==与赋值运算符=是两个不一样的运算符,不要弄混,有时候,可能会不小心写出以下的代码
if(x=3)

 上面示例中,原意x==3,但是不小心写成了x=3,这个式子表示对变量x 赋值3,它的返回值为3,所以if的判断总为真。

为了防止出现这种错误,有的程序员喜欢将变量写在等号的右边。

if(3==x)

这样的话,如果把==误写成=,编译器就会报错。

if(3=x)//报错

另外需要避免的错误是:多个运算符不宜连用。

i<j<k

上面示例中,连续使用两个小于运算符。这是合法表达式,不会报错,但通常达不到想要的结果,即不是保证变量j再i和k之间。这是因为关系运算符是从左到右进行运算的,所以实际执行的是下面的表达式。

(i<j)<k

上面的式子中,i<j返回0或1,所以最终是0或1与变量k进行比较,如果想要判断j的值是否再i和k之间,就应该用下面的写法。

i<j&&j<K

比如:我们输入一个年龄,如果年龄在18到36之间,我们就输出青年,如果我们这样写:

27410cb9141c4091ac357ae437ef1218.png

可以看到,我们输入的是5,仍然打印青年,什么原因呢?这是因为我们先拿18和age中存放的5比较,表达式18<=5为假,所以返回0,再拿0和36比较,0<=36为真,所以打印了青年,所以即使当age为5的时候,也能打印青年,逻辑上是有问题,这个代码应该怎么写呢?

fef336403aa641c8b9da94fa38e74de8.png

3.条件操作符

条件操作符也叫三目操作符,需要接受三个操作数的,形式如下:

exp1 ? exp2 : exp3

条件操作符的计算逻辑是:如果exp1为真,exp2计算,计算的结果是整个表达式的结果;如果exp1为假,exp3计算,计算的结果是整个表达式的结果。

正常不使用条件操作符的代码如下:

e650c195083147da981726aa97ed379f.png

用三目操作符改造后:

e73f3ed174e1413e8e168794b7136270.png

4.逻辑操作符

逻辑操作符提供逻辑判断功能,用于构建更负载的表达式,主要有下面3个运算符。

!:逻辑取反运算符(改变单个表达式的真假)

&&:与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)

||:或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)

4.1逻辑取反操作符!

比如,我们有一个变量flag,如果flag为假,要执行什么,就可以这样写

66c73018d8f74d489eead2e1b76f4f3e.png

如果flag为假,那么!flag就为真

所以上述代码执行if语句中的代码

4.2与操作符

&&就是与运算符,也是并且的意思,&&是一个双目操作符,使用方法是a&&b,&&两边的表达式都为真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。

比如:如果我们说月份3月到5月,是春天,那用代码怎么体现呢?

191b6b3e049646ea9551e2b94c52f375.png

这里表达的意思就是month既要大于等于3,有要小于5,必须同时满足。

4.3 或运算符

||就是或运算符,也就是或者的意思,||也是一个双目操作符,使用的方法是a||b,||的两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。

比如说:一年中的12月或者是1月或者是2月是冬天,怎么使用代码体现呢?

14acea3aa9d24be1b6273b36f66aceef.png

4.4短路

C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。  
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“ 短路”。
if(month>=3&&month<=5)

如果左操作数为0,右操作数就不会执行,整个表达式的结果也是0。

对于||操作符,结合前面的代码

if(month==12||month==1||month==2)

如果month==12,则不用往后判断了,整个表达式的结果就是1

所以, || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。
像这种仅仅根据左操作数的结果就能知道整个表达式的结果,不再对右操作数进⾏计算的运算称为 短路求值

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值