15-逻辑运算符分析

注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。

测试环境: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才代表假,其余的所有值均代表真。

发布了40 篇原创文章 · 获赞 1 · 访问量 1767

猜你喜欢

转载自blog.csdn.net/piaoguo60/article/details/103847732
今日推荐