
4.3.2 逻辑运算符及其表达式
逻辑运算符用来进行逻辑运算,逻辑运算也称布尔运算。用逻辑运算符连接操作数组成的表达式称为逻辑表达式。逻辑表达式的值(或称逻辑运算的结果)也只有真和假两个值。当逻辑运算的结果为真时,用1作为表达式的值;当逻辑运算的结果为假时,用0作为表达式的值。当判断一个逻辑表达式的结果时,则是根据逻辑表达式的值为非0时表示真;为0时表示假。逻辑运算符如表4-2所示。
表4-2 逻辑运算符

注意:除了逻辑非外,逻辑运算符的优先级低于关系运算符。逻辑非这个符号比较特殊,它的优先级高于算术运算符。逻辑运算符的优先级为:!大于&&,而&&大于||。
提示:在C语言中“非0即为真”。
例如,a=2;b=3;,则:

注意:当出现形如a&&b&&c的情况时,运算的过程为:只有a值为真,才判断b的值;只有a和b的值都为真,才判断c的值;同理,若形如a||b||c,只要a的值为真,就不必判断b和c的值,只有a的值为假,才判断b的值;a和b的值都为假时,才判断c的值。例如,a=1,b=2,c=3,运行表达式--a&&b++&&(c=c+3)后a的值为0,而b,c的值会保持不变,整个表达式的值也为0。因为--a已经为0,所以后面的运算不再进行。
技能训练1:关系运算与逻辑运算
训练目的与要求:学会关系运算和逻辑表达式的计算。常见运算符优先级关系如表4-3所示。
表4-3 常见运算符优先级关系

训练题目:表达式求值。
案例解析:
计算下列表达式的值。
若a=1,b=2,c=3,x=4,y=5;,请计算下列表达式的值。
(1)c<=a+b
(2)a=b>c
(3)(a==b)||(x==y)
(4)'a'&&'b'
(5)x!=5
上述表达式的计算结果分别为:
1,0,0,1,1
表达式(1)先计算a+b和为3,再判断c<=3,成立,所以结果为1。而表达式(2)是先比较b和c的大小,值为0,然后再把结果赋给a,所以a=0,表达式的结果也为0。表达式(3)a==b不成立,x==y也不成立,所以相当于0||0,所以结果为0。表达式(4)不是把变量a,b的值进行逻辑“与”运算,而是把字符'a'和'b'的ASCII码值进行逻辑运算,因为这两个字符的ASCII码值不为0(非0即为真),所以表达式的结果为1。表达式(5)x不等于5成立,所以结果为1。
【例4.4】设计一个应用程序,判断某一年是否为闰年。
扫一扫 看视频

算法分析:
通常判断某年为闰年有如下两种情况:
①该年的年份能被4整除但不能被100整除。
②该年的年份能被400整除。
假设在程序中用整型变量Y表示该年的年份。
上述两种情况可以分别表示为:
①(Y%4==0)&&(Y%100!=0)
②Y%400==0
而根据实际情况可知在上述两种情况中,只要能让其中任何一种成立,即可断定该年为闰年,因此最终用来判断某年是否为闰年的表达式如下:
(Y%4==0)&&(Y%100!=0)||(Y%400==0)
当表达式的值为1时则该年为闰年,为0时则为非闰年。
程序代码如下:

程序的运行结果为:

【例4.5】设计一个应用程序,判断某一年是否为闰年。(设定一个标记闰年的标记leap变量)
程序流程图如图4-7所示。

图4-7 例4.5的程序流程图
程序代码如下:

程序的运行结果为:

程序的运行结果和例4.4的是一样的。说明:程序中应用了标准的“if…else…”形式,在第一个if语句中判断闰年的条件,程序中引入了一个标志性的变量,名为leap(这个变量名用户可以自己定义其他的名称),若是闰年,将leap设为1,否则将leap设为0。在第二个if语句中只需看leap是否为真就可以了。在实际应用中,有些程序需要这样设定一个如leap的变量表示某种状态,以方便应用,读者可以根据需要灵活应用。本例中也可以不用,如上面的例4.4。
思考:输入今年的年号,验证一下今年是否为闰年?
注意:在条件语句中“等于”用“==”,要区别于赋值语句中的“=”。“||”为“或”(或者),“&&”为“与”(并且)。
if或else子句中有两个以上的语句时,需要用{}括起来。
例如,表示如果a小于b,将两个数交换,则程序代码应为:

表示若满足if语句中a<b的条件时需要执行三条语句,必须用{}括起来;若没有花括号,则表示a<b条件满足时只执行第一条语句t=a;,后面的两条语句不受if条件的限制。