1. 有趣问题:逻辑运算符&&,||和!真的很简单吗?
【实例分析】初探逻辑运算符
#include <stdio.h> int main() { int i = 0; int j = 0; int k = 0; //等价于(true && ++i) ||(++j && ++k)可见整个表达式为或运算,从左向右进行 //或运算,先计算或左边的(true && ++i)结果为true,根据“或”的短路规则,不再 //进行右边的(++j && ++k)。 ++i || ++j && ++k; printf("%d ", i); //i为1 printf("%d ", j); //0 printf("%d ", k); /0 return 0; }
2. 程序中的短路
(1)||从左向右开始计算
①当遇到为真的条件时停止运算,整个表达式为真
②所有条件为假时表达式才为假
(2)&&从左向右开始计算
①当遇到为假的条件时停止运算,整个表达式为假
②所有条件为真时表达式才为真
3. 逻辑表达式中,&&比||具有更高的优先级
▲ 在&&和||混合运算时,整个表达式被看作||表达式,编译器从左向右开始计算&&表达式,当某个&&表达式的值为真时,停止计算,整个表达式的值为真。
【实例分析】程序中的短路规则
#include <stdio.h> int g = 0; int f() { printf("In f()... "); return g++; } int main() { //等价(true && g) || (f() && f()) //或的左边为false,继续计算右边的(f() && ()) //所以先输出f中的printf语句,由于第1个f返加0 //而或右边的表达式是“与”运算,所以短路,即右 //则表达式返回false,整个表达式为false。下列的 //if语句中的printf不被执行。 if( g || f() && f() ) { printf("In if statement: %d ", g); } printf("In main(): %d ", g); return 0; } //输出结果 //In f()... //In main(): 1
4. “!”究竟是神马
【实例分析】逻辑非运算符的使用
#include <stdio.h> int main() { printf("%d ", !0); //1 printf("%d ", !1); //0 printf("%d ", !100); //0 printf("%d ", !-1000);//0 return 0; }
▲C语言中的逻辑非“!”只认得0,只知道见了0就返回1。当碰见其它值时,返回0。
5. 小结
(1)程序中的逻辑表达式遵循短路规则
(2)在&&与||混合运算时
①整个表达式被看作||表达式;②从左向右计算&&表达式;③最后计算||表达式
(3)逻辑非!运算符只认得0。碰见0返回1,否则统统返回0。(只有0才表示假,其余均为真)