注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。
测试环境:Ubuntu 10.10
GCC版本:4.4.5
一、印象中的逻辑运算符
1)对话……
- 学生:
*老师,在我的印象中,逻辑运算符用在条件判断的时候,真挺简单的,有必要在进阶课程中讲解吗?
- 老师:
*逻辑运算符确实在条件判断的时候用得比较多,但是这并不能说明简单……
二、有趣的问题
1)逻辑运算符&&,||和!真的很简单吗?
下面的程序运行结束后,i,j,k的值分别为多少?
int i = 0;
int j = 0;
int k = 0;
++i||++j&&++k;
实例分析
初探逻辑运算符
15-1.c
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
int k = 0;
++i || ++j && ++k;
printf("%d\n", i); //1
printf("%d\n", j); //0
printf("%d\n", k); //0
return 0;
}
操作:
1) gcc 15-1.c -o 15-1.out编译正确,打印结果:
1
0
0
分析:
只有逻辑或(||)左边的先执行,因为坐标表达式逻辑值为1,右边内容没必要执行,发生短路。
扩展:
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
int k = 0;
int s = 0;
++s && ++i || ++j && ++k;
//gxn: (++s && ++i)||(++j && ++k); ==> &&优先级大于||
printf("%d\n", s); //1
printf("%d\n", i); //1
printf("%d\n", j); //0
printf("%d\n", k); //0
return 0;
}
操作:
1) gcc test.c -o test.out编译正确,打印结果:
1
1
0
0
1.++i执行完,i = 1(s同理)
2.因此1||(逻辑或)上任何东西都是真的,编译器在这里进行优化后边的++j&&++k不执行。
三、逻辑运算符分析
1)程序中的短路
- ||从左向右开始计算:
*当遇到为真的条件时停止计算,整个表达式为真(真就停)
*所有条件为假时表达式才为假
- &&从左向右开始计算:
*当遇到为假的条件时停止计算,整个表达式为假(假就停)
*所有条件为真时表达式才为真
2)逻辑表达式,&&比||具有更高的优先级
++i||++j&&++k;
|
V
(++i)||(++j && ++k);
|
V
(true && ++i)||(++j && ++k);
在&&和||混合运算时,整个表达式被看作||表达式,
编译器从左向右开始计算&&表达式,当某个&&表达
式的值为真时,停止计算,整个表达式的值为真。
实例分析
程序中的短路规则
15-2.c
#include <stdio.h>
int g = 0;
int f()
{
printf("In f()...\n");
return g++; //先返回g,在++
}
int main()
{
if( g || f() && f() ) //(true && g) || (f() && f()) 假||假
{
printf("In if statement: %d\n", g);
}
printf("In main(): %d\n", g);
return 0;
}
操作:
1) gcc 15-2.c -o 15-2.out编译正确,打印结果:
In f()...
In main():1
分析:
逻辑或左边:g = 0为假 逻辑或右边:执行f()返回g++(先返回g=0),为假,逻辑与停止执行。因此打印In f()...
四、逻辑运算符分析
1)"!"究竟是神马?
int main()
{
printf("%d\n",!0);
printf("%d\n",!1);
printf("%d\n",!100);
printf("%d\n",!-1000);
return 0;
}
打印结果:
1
0
0
0
C语言中的逻辑非"!"只认得0,只知道见了0就返回1。因此当其碰见的值不是0时,其结果为0。
实例分析
逻辑非运算符的使用
15-3.c
#include <stdio.h>
int main()
{
printf("%d\n", !0); //1
printf("%d\n", !1); //0
printf("%d\n", !100); //0
printf("%d\n", !-1000); //0
return 0;
}
操作:
1) gcc 15-3.c -o 15-3.out编译正确,打印结果:
1
0
0
0
分析:
0表示逻辑假,非零值(-1,1.2等)都为逻辑真。
小结
1)程序中的逻辑表达式遵从短路规则
2)在&&与||混合运算时:
- 整个表达式被看做||表达式
- 从左向右先计算&&表达式
- 最后计算||表达式
3)逻辑非!运算符只认得0
- 碰见0返回1,否则统统返回0
只有0才代表假,其余的所有值均代表真。