1秒写出逻辑运算符的优先级判定表达式

文章讲述了C语言中逻辑运算符与(&&)、或(||)和非(!)的优先级通过实际代码示例进行比较,并揭示了通过特定数值配置检验优先级的技巧。最后总结出一个规律:头尾与运算符相邻时必须是0与1,以此来验证优先级。
摘要由CSDN通过智能技术生成

咱们经常说的“与或非”指的是一种逻辑关系,它们的运算符分别为&&、||、!。那么,它们的优先级最怎样的?也就是说,在同一个表达式中优先计算哪个运算符?

试试就知道。

#include<stdio.h>
int main(){
    //&&与||的优先级比较
    printf("%d %d %d\n", 0&&1||1, (0&&1)||1, 0&&(1||1));
    printf("%d %d %d\n", 1||1&&0, (1||1)&&0, 1||(1&&0));

    //||与!的优先级比较
    printf("%d %d %d\n", !1||1, (!1)||1, !(1||1));

    //&&与!的优先级比较
    printf("%d %d %d\n", !1&&0, (!1)&&0, !(1&&0));
    return 0;
}

通过将括号放到不同的位置,改变运算的优先级,然后看第1个表达式的输出结果与后面哪个表达式相同,即可简单判断出他们的优先级。

输出结果:

1 1 0

1 0 1

1 1 0

0 0 1

可见,优先级为:!> &&>||。

这段代码考验脑筋的地方在于,要巧秒配置1和0,使括号放在表达式前面、后面的输出结果是不一样的。

如果你懒得动脑,且又一把子力气无处安放,可以试试把所有情况全部输出出来,让电脑帮咱找出那些输出结果不同的。这个问题就变成了排列问题,没多少,一共也就24种而已。

#include<stdio.h>
int main(){
    printf("前&&后||全排列输出:\n");
    printf("%d %d %d\n", 0&&0||0, (0&&0)||0, 0&&(0||0));
    printf("%d %d %d\n", 0&&0||1, (0&&0)||1, 0&&(0||1)); //结果不同
    printf("%d %d %d\n", 0&&1||0, (0&&1)||0, 0&&(1||0));
    printf("%d %d %d\n", 0&&1||1, (0&&1)||1, 0&&(1||1)); //结果不同
    printf("%d %d %d\n", 1&&0||0, (1&&0)||0, 1&&(0||0));
    printf("%d %d %d\n", 1&&0||1, (1&&0)||1, 1&&(0||1));
    printf("%d %d %d\n", 1&&1||0, (1&&1)||0, 1&&(1||0));
    printf("%d %d %d\n", 1&&1||1, (1&&1)||1, 1&&(1||1));

    printf("\n前||后&&全排列输出:\n");
    printf("%d %d %d\n", 0||0&&0, (0||0)&&0, 0||(0&&0));
    printf("%d %d %d\n", 0||0&&1, (0||0)&&1, 0||(0&&1));
    printf("%d %d %d\n", 0||1&&0, (0||1)&&0, 0||(1&&0));
    printf("%d %d %d\n", 0||1&&1, (0||1)&&1, 0||(1&&1));
    printf("%d %d %d\n", 1||0&&0, (1||0)&&0, 1||(0&&0)); //结果不同
    printf("%d %d %d\n", 1||0&&1, (1||0)&&1, 1||(0&&1));
    printf("%d %d %d\n", 1||1&&0, (1||1)&&0, 1||(1&&0)); //结果不同
    printf("%d %d %d\n", 1||1&&1, (1||1)&&1, 1||(1&&1));

    printf("\n|与!的全排列输出:\n");
    printf("%d %d %d\n", !0||0, (!0)||0, !(0||0));
    printf("%d %d %d\n", !0||1, (!0)||1, !(0||1)); //结果不同
    printf("%d %d %d\n", !1||0, (!1)||0, !(1||0));
    printf("%d %d %d\n", !1||1, (!1)||1, !(1||1)); //结果不同

    printf("\n&&与!的全排列输出:\n");
    printf("%d %d %d\n", !0&&0, (!0)&&0, !(0&&0)); //结果不同
    printf("%d %d %d\n", !0&&1, (!0)&&1, !(0&&1));
    printf("%d %d %d\n", !1&&0, (!1)&&0, !(1&&0)); //结果不同
    printf("%d %d %d\n", !1&&1, (!1)&&1, !(1&&1));

    return 0;
}

这个力气咱不白花,细心观察,你会发现一个规律:头尾两个数,与&&挨着的必须是0,与||挨着的必须是1。

只要满足这个条件输出结果就会不同,其他地方0或1均可。

知道了这个规律,下次你忘了他们三个的优先级,就可以立刻无脑写出用于验证的表达式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金创想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值