2.4.4 逻辑运算符和逻辑表达式
C语言中逻辑运算符有3个:! 逻辑非;&& 逻辑与;|| 逻辑或。
其中,!是单目运算符,&&和||是双目运算符,要求有两个操作数,如(i>j)&& (b<c)。
逻辑运算符的作用如表2.4.1所示。
表2.4.1 逻辑运算符的作用
由逻辑运算符和操作数构成的表达式称为逻辑表达式。表2.4.1中的i和j代表表达式,类型可以是整型、浮点型、字符型和指针型,如78、'r'+45、3.14*y、a>b和c!=0等。
逻辑表达式的值只有“真”和“假”两个值,真用1表示,假用0表示。
(1)逻辑非运算符!
单个表达式逻辑值的“反”。例如,!i表示i的反,即:若i为真(即i的值非0),则!i为假;反之,若i为假(即i的值为0),则!i为真。
在表示逻辑结果时,不管其具体数值是多少,只要不等于0,逻辑值就为真,用1表示;仅当其值等于0时,逻辑值才为假,用0表示。!!x的值就不等于x(除非x等于1)。
(2)逻辑与运算符&&
仅当两个操作数同时为真时,结果才为真;否则,只要其中有一个为假,结果就是假。
例如,50&&60的结果是1。
(3)逻辑或运算符 ||
只要其中有一个操作数为真,结果就为真;仅当二者同时为假时,结果才为假。例如,如果a为68,b为90,那么
a>b||a!=b
的结果为真。因为a>b的值虽然为0,但a!=b的值是1,0||1的值仍为1。
在一个逻辑表达式中如果包含多个逻辑运算符,应按这三个逻辑运算符的优先级和结合性进行运算。这三个逻辑运算符的优先级是:!的优先级高于&&的优先级,&&的优先级又高于||的优先级;运算是按照自左至右的顺序进行,即其结合性为左结合性。
另外,!与增量运算符++、--属于同一级,高于算术运算符的优先级;而&&和||低于算术运算符和关系运算符的优先级,但高于赋值运算符的优先级。所以
a>b||a!=b
等价于
(a>b)||(a!=b)
而
(a=35)||a!=b
与
a=35||a!=b
是不同的。前一个表达式是逻辑或表达式,即:先将35赋予a,然后执行a||a! =b。而后一个表达式是赋值表达式,即:先执行35||a!=b,再将结果赋予a。由于35是非0值,所以35||a!=b的结果是1,最后a的值也是1。
需要特别注意的是:在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只有在必须执行下一个逻辑运算符才能求解出表达式的解时,才执行该运算符。即只要得到了结果,求值的过程就停止:短路求值。这是逻辑运算符的一个重要性质。
例如:假设a=1,b=0,c=−2,则求下列表达式的值:
(1)a && b && c
这种情况下,只有a为真(非0)时,才需要判别b的值,只有a和b都为真的情况下才需要判别c的值。只要a为假,就不必判别b和c(此时整个表达式的值已确定为假)。如果a为真,b为假,不判别c。
运算时,先做a && b,结果为0,运算终止。运算结束,表达式的值为0,a、b、c的值保持原值不变。
(2)(a++) || ++b && --c
运算时,先做a++,由于是后缀形式,先取出a的值1做逻辑或||,然后a的值再加1,因为是做逻辑或||,所以表达式的结果为1,运算终止。所以,运算结束时,表达式的值为1。a的值为2,b、c的值保持原值不变。
对于运算符&&,只要其左边表达式为0,则整个逻辑表达式的值就确定为0,从而不计算其右边表达式;只有其左边表达式不等于0时,才继续进行右边表达式的运算。
对于运算符||,只要其左边表达式为1,则整个逻辑表达式的值就确定为1,从而不再计算其右边表达式;只有其左边表达式不等于1时,才继续进行右边表达式的运算。
熟练掌握C语言的关系运算符和逻辑运算符,可以巧妙地用一个逻辑表达式来表示一个复杂的条件。
例如:判断某一年year是否闰年。
闰年的满足条件是:能被4整除而不能被100整除,或者能被400整除。
可用一个逻辑表达式来表示:
(year%4= =0 && year%100!=0)|| year%400= =0
如果上述表达式值为真(即为1),则year为闰年;否则为非闰年。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。