Aseeker 发表于 2019-12-28 19:03:13

关于逻辑符号的应用

#include<stdio.h>
void main()
{
        int a=0,b=2,c=3;
        if(a--&&--b||++c);
        printf("%d %d %d",a,b,c);
        system("pause");
}

结果:-1 2 4

#include<stdio.h>
void main()
{
        int a=1,b=1,c=2;
        if(a--||b--&&++c);
        printf("%d %d %d",a,b,c);
        system("pause");
}
结果:0 1 2

为什么分别结果是这样,可以告诉是怎么判断的吗

superbe 发表于 2019-12-28 23:17:51

本帖最后由 superbe 于 2019-12-29 10:21 编辑

首先要清楚:
1、&&的优先级比||高
2、对于A&&B,如果A为假则结果为假,不再判断B;如果A为真,必须接着判断B,才能判定结果真假。
3、对于A||B,如果A为真则结果为真,不再判断B;如果A为假,必须接着判断B,才能判定结果真假。
4、后置--运算符是“先使用再自减”,前置--运算符是“先自减再使用”。++运算符同理。

上面明白了,其实自己就能分析出结果了。

下面是我的分析,可以不看,表达的不好。

第一段代码:

&&的优先级比||高,所以 a--&&--b||++c 相当于 (a--&&--b)||++c ,为叙述方便,用(①&&②)||③表示

||左边的①先取出a的值(为0)参加判断,因为&&的逻辑是只要一个为假结果就为假,所以此时就可以判定(①&&②)为假了,不需再判断②,所以--b没有执行,b的值没有变化(b==2),而a的值在使用完后再自减,变成了-1。

因为||左边已经为假,必须接着判断③才能判定整个式子的真假,而++c是先自增1变成了4,显然为真。

最后整个式子就变成了假||真==真。所以打印a,b,c的值分别是-1,2,4。

第二段代码:

同样由于优先级的关系,a--||b--&&++c,相当于 a--||(b--&&++c),表示成①||(②&&③)

||左边的①先取出a的值(为1)参加判断,显然为真。
因为||的逻辑是只要一个为真结果就为真,所以此时就可判定整个式子为真,||右边就不需再进行判断了,也就是②和③都没有被执行,b和c的值没有变化(b==1,c==2)。而a的值在使用完后再自减,变成了0。

最后整个式子为真,打印a,b,c的值分别是0,1,2。
页: [1]
查看完整版本: 关于逻辑符号的应用