逻辑运算符的优先级老是忘?只因你没想明白它的逻辑!
大多部编程语言中,逻辑运算符的优先级都会设置成! > > > && > > >||,你有没有想过,这是为什么呢?
一、优先逻辑分析
1.1 为什么逻辑与比逻辑或优先级高
这是因为在逻辑运算中,通常希望先执行更“限制性”的运算。
所谓的“限制性”,就是自由度小,限制多。
这种先执行更“限制性”的运算其实是与人的生活习惯相一致的。
因为更强的限制代表着更严格和精确的要求,通常是人们经过深入思考过的、比较紧要的,因此应该优先考虑。
逻辑与要求两个操作数都为真时才返回真,而逻辑或只需要其中一个操作数为真就返回真。这说明逻辑与比较“严格”,而逻辑或则比较“宽松”,所以逻辑与的优先级应比逻辑或高。
举个例子就明白了,比如一个妹子要找对象,她的择偶标准有三个条件:a-善良,b-帅,c-有钱。
表达式1:(a&&b)||c
它的意思是说:如果心地善良,并且长得帅,就是我的菜,如果实在不行有钱有行啊!
相比有钱,善良并且帅显然是经过更深入思考的,是限制性更强的条件,因此也是我们相对来说更看重的。虽然它和有钱是或的关系,但在妹子的内心深处,有钱只是退而求其次的选择。即便她选择了后者,只不过是屈从了现实而不是内心所愿。
换个角度说,这里其实表达的是择偶的两种标准,一种是善良并且帅,一种是有钱。善良并且帅本身就是一种标准中的内部条件,理应优先计算。
表达式2:a&&(b||c)
它的意思是说:心地善良是前提,这是必须的。然后嘛,怎么也得帅点儿吧,如果不帅有钱也行啊。
你看,即便把括号放在后面,她先看的还是前面的“与”。
即便你写成(b||c) && a
,相当于说:要么帅要么有钱,两者至少有一样,此外必须要心地善良。
请问她优先考虑的点变了吗?
这就是“逻辑与”比“逻辑或”优先级高的现实依据。
1.2 为什么逻辑非优先级最高
这是因为它是个一元运算符,即对单个操作数进行运算的运算符。在逻辑运算中,一元运算符通常具有比二元运算符更高的优先级。
其实这一点也符合生活习惯。还是拿找对象举例,比如一大叔对大伙说他家闰女找对象的条件,有两种说法:
①俺闰女找对象要求:不矮、不丑、不傻、不穷。
②俺闰女找对象要求:矮、丑、傻、穷,这些都不行。
请问哪种说法更符合人们的日常表达习惯呢?
二、符号的象形解释
逻辑非的符号是!
,一个感叹号,表达的感情最强烈。就像干柴烈火的热恋男女一样,一刻也等不了,必须首先让它满足。
逻辑与的符号是&&
,长得像连接人与人的红飘带,因此它的连接关系也是比较紧密的。
逻辑或的符号是||
,长得就像一堵墙,是把东西隔离开来的。正所谓“墙里秋千墙外道,墙外行人,墙里佳人笑”。因此它的关系是最不紧密的,故此应该最后考虑。
如果你无论无何也想不起来逻辑运算符的优先级,还有一个办法,就是自己写个代码测试一下,比如:
#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秒写出逻辑运算符的优先级判定表达式》
标签:逻辑,优先级,有钱,找对象,运算符,&& From: https://blog.csdn.net/jjmhx/article/details/145284735