首页 > 编程笔记 > C语言笔记(精华版)

C语言逻辑运算符的优先级(附带示例)

在C语言中,逻辑运算符用于执行布尔运算,了解逻辑运算符的优先级对于编写正确的逻辑表达式至关重要。C语言中主要有三种逻辑运算符:逻辑非(!)、逻辑与(&&)和逻辑或(||)。这些运算符的优先级不仅影响表达式的计算顺序,还会直接影响程序的执行结果。


逻辑运算符的优先级从高到低排列如下:


逻辑非(!)具有最高的优先级。它是一个一元运算符,用于对一个布尔表达式取反。例如,如果 x 为真,那么 !x 就为假;如果 x 为假,那么 !x 就为真。在复杂的逻辑表达式中,逻辑非会先于其他逻辑运算符执行。
 

逻辑与(&&)的优先级次之。它是一个二元运算符,只有当两个操作数都为真时,整个表达式才为真。如果第一个操作数为假,逻辑与会短路,不再评估第二个操作数。
 

逻辑或(||)的优先级最低。它也是一个二元运算符,只要有一个操作数为真,整个表达式就为真。如果第一个操作数为真,逻辑或会短路,不再评估第二个操作数。


让我们通过一个例子来理解这些优先级规则:

#include <stdio.h>

int main() {
    int a = 5, b = 0, c = 10;
    
    if (!a && b || c) {
        printf("条件为真\n");
    } else {
        printf("条件为假\n");
    }
    
    return 0;
}

在这个例子中,表达式 !a && b || c 的计算顺序如下:

  1. 首先计算 !a。由于 a 不为 0(在 C 语言中非零值视为真),所以 !a 的结果为 0(假)。
  2. 接着计算 (!a) && b。0 && 0 的结果为 0。
  3. 最后计算 ((!a) && b) || c。0 || 10 的结果为 1(真)。


因此,整个条件表达式的结果为真,程序将输出 "条件为真"。

条件为真


理解逻辑运算符的优先级对于避免常见的逻辑错误至关重要。例如,如果我们想要表达“a 不为 0 且 b 为 0,或者 c 不为 0”,正确的表达式应该是 ((!a && b) || c),而不是 (!a && b || c)。在复杂的逻辑表达式中,建议使用括号明确指定运算顺序,这样可以提高代码的可读性,并减少因优先级混淆导致的错误。


此外,值得注意的是,逻辑运算符的短路特性可以用来优化代码性能。例如,在 a && func() 这样的表达式中,如果 a 为假,func() 就不会被调用。这种特性可以用来避免不必要的计算,特别是当 func() 是一个耗时的操作时。

推荐阅读