逻辑运算符&&、||和!真的很简单吗?
下面程序的输出是什么?
int i=0; j=0; k=0; ++i||++j&&++k; #include <stdio.h> int main() { int i=0; int j=0; int k=0; int s = 0; s = ++i||++j&&++k; printf("i = %d\n", i); printf("j = %d\n", j); printf("k = %d\n", k); printf("s = %d\n", s); return 0; }
在Linux下使用GCC编译运行:
i = 1 j = 0 k = 0 s = 1
逻辑运算符中,存在一个“短路的概念。
||:从左往右计算,遇到第一个为真的条件时,停止运算,整个表达式为真,所有条件为假时表达式为假。
&&:从左往右运算,遇到第一个为假的条件则停止计算,表达式为假;所有条件为真时表达式才为真。
逻辑表达式中,&&比||具有更高的优先级,所以最后进行||运算,所以上面的逻辑运算等价为:
++i||++j&&++k ==>> (++i) || (++j&&++k) ==>>> (true && ++i) || (++j&&++k)
即,在&&和||混合运算时,整个表达式被看做||表达式,编译器从左往右开始计算&&表达式,当某个&&表达式的值为真时,停止计算,整个表达式的值为真。
观察下面代码,判断输出:
#include <stdio.h> int g=0; int f() { printf("Func f() is running.\n"); return g++; } int main() { if( g || f() && f() ) { printf("In if statement.\n"); } printf("In main(): %d\n", g); return 0; }
g || f() && f() --> (true && g) || (f() && f())
所以输出为:
Func f() is running. In main(): 1
逻辑!究竟是什么呢?
观察下面代码,判断输出:
int main() { printf("%d\n", !0); printf("%d\n", !1); printf("%d\n", !100); printf("%d\n", !-1000); return 0; }值得注意的是,逻辑!只认得0,只知道见到了0就返回1,因此当遇到其他不是0的值时,直接返回0。
所以上述代码的运行结果为:
1 0 0 0
小结:程序中的逻辑表达式遵循短路规则;
在&&和||混合运算中,整个表达式被看做||表达式,从左往右开始计算&&(可进行转换),最后运算||表达式。
逻辑非!运算符只认得0,遇见0返回1,否则直接返回0.