作者 | 梁唐
大家好,我是梁唐。
这是EasyC++系列的第24篇,咱们来聊聊逻辑表达式。
我们无论是在for
循环还是while
循环或者是if
条件判断当中,都用到了逻辑判断。
我们之前举的例子都非常简单,都是单个的判断。有时候我们的逻辑非常复杂,判断的条件有多个,这个时候就需要使用逻辑表达式了。
逻辑表达式由多个逻辑运算符连接在一起,逻辑运算符分别有OR, AND和NOT,翻译过来就是与或非。
or运算符翻译过来是“或”的意思,表示两者或多者当中,有一个为true
时结果为true
,写作||
,注意这里有两个竖线,单个竖线也是或运算,不过是位运算当中的或运算,表示的含义不同,千万不要搞错。
使用或运算符我们可以将多个判断条件并列在一起,只要有一个为true
,最终的结果就是true
。
5 == 5 || 4 < 4;
5 > 3 || 2 < 1 || 4 < 7;
这里||
运算符的计算优先级比比较运算符低,所以这里可以不用括号。另外C++当中规定||
运算符也是一个顺序点,意味着编译器会计算左侧的值,再计算右侧的值。只要遇见表达式的结果为true
则停止,不会再继续往右计算。
and运算符翻译过来是“与”的意思,表示两个条件同时满足,即两者皆为true
时结果为true
,写作&&
。
5 == 5 && 4 == 4;
4 == 3 && 1 < 2;
同样,&&
运算符的优先级也小于比较运算符。另外,&&
运算符也是顺序点。意味着C++先执行左侧结果,再执行右侧。如果左侧结果为false
,那么右侧的结果将不会再执行。这个特性非常有用,特别是当我们使用一些可能会非法的元素的时候,例如:
string s;
if (n < s.size() && s[n] == 'h') {
// do something
}
在上面这个例子当中,我们需要判断s[n]
这个元素,但是由于n可能很大超过字符串的范围。所以在使用之前需要先进行判断,如果n < s.size()
不成立,那么s[n]==h
的判断将不会执行,也就不会引发报错了。
C++当中还给了一个case,当我们用&&
运算符来判断范围的时候,千万不要进行简写:
if (a >= 5 && a < 10); // 合法
if (5 <= a < 10); // 非法
因为后者在编译器当中表示不同的含义,会被翻译成(5 <= a) < 10
,也就是先判断5 <= a
,拿这个结果再去和10进行判断。显然5 <= a
的结果是一个bool
值,它一定是小于10的,那么无论a
等于多少,这个表达式永远为true
。
not运算符也就是非运算符,表示对一个逻辑表达式的结果取反。true
变成false
,false
变成true
,写作!
。例如:
if (!(x > 5));
and和or运算符的优先级都低于比较运算符,但not运算符不然,它的优先级高于所有的关系运算符和算术运算符。所以如果我们取反的对象是一个表达式,一定要记得加上括号。
比如:
!(x > 5);
!x > 5;
后者会先对x计算取反的操作,得到的结果为true
或false
,无论是哪个值它都显然小于5。
另外,not运算符的优先级高于and高于or。因此表达式:
age > 30 && age < 45 && !flag || weight > 300
会被解释成:
(age > 30 && age < 45 && (!flag)) || weight > 300