有趣的问题:
示例如下:
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = 0; 6 int j = 0; 7 int k = 0; 8 9 ++i || ++j && ++k; 10 11 printf("%d\n", i); 12 printf("%d\n", j); 13 printf("%d\n", k); 14 15 return 0; 16 }
运行结果如下:
逻辑与的优先级较高并不等于先计算逻辑与,如上图中的等价代换。在逻辑与和逻辑或混合运算时,整个表达式被看成逻辑或表达式。
上图中编译器从左向右依次计算每个括号中逻辑与的表达式的值,这才是真正的在逻辑运算符表达式中逻辑与比逻辑或具有更高优先级的体现。
短路规则示例:
1 #include <stdio.h> 2 3 int g = 0; 4 5 int f() 6 { 7 printf("In f()...\n"); 8 9 return g++; 10 } 11 12 int main() 13 { 14 if( g || f() && f() ) 15 { 16 printf("In if statement: %d\n", g); 17 } 18 19 printf("In main(): %d\n", g); 20 21 return 0; 22 }
等价代换后的程序:
运行结果如下:
逻辑非运算符:
示例如下:
1 #include <stdio.h> 2 3 int main() 4 { 5 printf("%d\n", !0); 6 printf("%d\n", !1); 7 printf("%d\n", !100); 8 printf("%d\n", !-1000); 9 10 return 0; 11 }
运行结果如下:
小结: