关于逻辑符号的应用
#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-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]