咱们经常说的“与或非”指的是一种逻辑关系,它们的运算符分别为&&、||、!。那么,它们的优先级最怎样的?也就是说,在同一个表达式中优先计算哪个运算符?
试试就知道。
#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均可。
知道了这个规律,下次你忘了他们三个的优先级,就可以立刻无脑写出用于验证的表达式。