跳转至

逻辑运算符

多个条件放在一起判断,要用逻辑运算符。

逻辑与,&&

两边都成立才成立;有一个不成立,就不成立。

if (x >= 10 && x <= 20) {
    cout << "在10到20之间";
}

x >= 10,并且 x <= 20,包含 10 和 20。

逻辑或,||

有一个成立就成立;两边都不成立,才不成立。

if (x < 10 || x > 20) {
    cout << "小于10,或者大于20";
}

注意:两边都成立时,逻辑或的结果也是成立。

逻辑非,!

取反,成立变成不成立,不成立变成成立。

bool flag = false;
if (!flag) {
    cout << "flag是假";
}

对整个条件取反,要加括号。

if (!(x >= 10 && x <= 20)) {
    cout << "不在10到20之间";
}

这个条件,与 x < 10 || x > 20 的意思一样。

运算优先级

这三个逻辑运算符,优先级从高到低是:!、&&、||。

! 比关系比较优先级高,&&、|| 比关系比较优先级低。

if ((a > 0 && b > 0) || c > 0) {
    // a、b都大于0,或者c大于0
}

条件复杂时,加括号分组,别让读代码的人跟着猜。

短路判断

&& 左边不成立,右边就不再判断。

if (b != 0 && a / b > 2) {
    // b不为0,才会计算a / b
}

|| 左边成立,右边就不再判断。

if (x == 0 || y / x > 2) {
    // x为0时,右边不再计算
}

顺序很重要。需要先检查除数,就把检查写在左边。

常见错误

&&、||,不要少写一个符号

&、| 是按位运算符,与 &&、|| 不同,不能随手替换。

每个条件,要写完整

判断 x 是否等于 1 或 2:

if (x == 1 || x == 2) { // 正确
    // ...
}
if (x == 1 || 2) { // 错误:不能省略第二个x ==
    // ...
}

整数用作条件时,0 表示不成立,非 0 表示成立。

所以 x == 1 || 2 总是成立,不是在判断 x 是否等于 1 或 2。