C语言逻辑运算符 #

一、逻辑运算符概述 #

1.1 三种逻辑运算符 #

运算符 名称 示例 说明
&& 逻辑与 a && b 两者都为真
|| 逻辑或 a || b 至少一个为真
! 逻辑非 !a 取反

1.2 真值表 #

逻辑与 (&&):

a b a && b
0 0 0
0 1 0
1 0 0
1 1 1

逻辑或 (||):

a b a || b
0 0 0
0 1 1
1 0 1
1 1 1

逻辑非 (!):

a !a
0 1
1 0

二、逻辑与运算符 #

2.1 基本使用 #

c
#include <stdio.h>

int main() {
    int a = 5, b = 10;
    
    if (a > 0 && b > 0) {
        printf("a和b都是正数\n");
    }
    return 0;
}

2.2 多条件组合 #

c
#include <stdio.h>

int main() {
    int score = 85;
    
    if (score >= 60 && score < 90) {
        printf("成绩良好\n");
    }
    return 0;
}

2.3 短路求值 #

c
#include <stdio.h>

int main() {
    int a = 0;
    
    if (a != 0 && 10 / a > 1) {
        printf("不会执行\n");
    }
    
    printf("程序正常结束\n");
    return 0;
}

如果第一个条件为假,第二个条件不会执行,避免除以零错误。

三、逻辑或运算符 #

3.1 基本使用 #

c
#include <stdio.h>

int main() {
    int age = 15;
    
    if (age < 18 || age > 60) {
        printf("可以享受优惠\n");
    }
    return 0;
}

3.2 多条件组合 #

c
#include <stdio.h>

int main() {
    char c = 'A';
    
    if (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') {
        printf("%c是元音字母\n", c);
    }
    return 0;
}

3.3 短路求值 #

c
#include <stdio.h>

int main() {
    int a = 1;
    
    if (a == 1 || 10 / 0 > 1) {
        printf("执行\n");
    }
    return 0;
}

如果第一个条件为真,第二个条件不会执行。

四、逻辑非运算符 #

4.1 基本使用 #

c
#include <stdio.h>

int main() {
    int a = 0;
    
    if (!a) {
        printf("a为假\n");
    }
    return 0;
}

4.2 取反条件 #

c
#include <stdio.h>

int main() {
    int a = 5;
    
    if (!(a > 10)) {
        printf("a不大于10\n");
    }
    return 0;
}

4.3 检查空指针 #

c
#include <stdio.h>

int main() {
    int* p = NULL;
    
    if (!p) {
        printf("指针为空\n");
    }
    return 0;
}

五、运算符优先级 #

5.1 优先级顺序 #

text
高  !
    && 
低  ||

5.2 示例 #

c
#include <stdio.h>

int main() {
    int a = 1, b = 0, c = 1;
    
    printf("!a = %d\n", !a);
    printf("a && b = %d\n", a && b);
    printf("a || b = %d\n", a || b);
    printf("a && b || c = %d\n", a && b || c);
    printf("a || b && c = %d\n", a || b && c);
    return 0;
}

输出:

text
!a = 0
a && b = 0
a || b = 1
a && b || c = 1
a || b && c = 1

5.3 使用括号 #

c
#include <stdio.h>

int main() {
    int a = 1, b = 0, c = 1;
    
    printf("(a || b) && c = %d\n", (a || b) && c);
    printf("a || (b && c) = %d\n", a || (b && c));
    return 0;
}

六、实际应用 #

6.1 范围判断 #

c
#include <stdio.h>

int main() {
    int age = 25;
    
    if (age >= 18 && age <= 60) {
        printf("成年工作年龄\n");
    }
    return 0;
}

6.2 字符分类 #

c
#include <stdio.h>

int main() {
    char c = 'A';
    
    if (c >= 'A' && c <= 'Z') {
        printf("大写字母\n");
    } else if (c >= 'a' && c <= 'z') {
        printf("小写字母\n");
    } else if (c >= '0' && c <= '9') {
        printf("数字\n");
    }
    return 0;
}

6.3 输入验证 #

c
#include <stdio.h>

int main() {
    int month;
    printf("请输入月份: ");
    scanf("%d", &month);
    
    if (month >= 1 && month <= 12) {
        printf("有效月份\n");
    } else {
        printf("无效月份\n");
    }
    return 0;
}

6.4 闰年判断 #

c
#include <stdio.h>

int main() {
    int year = 2024;
    
    if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
        printf("%d年是闰年\n", year);
    } else {
        printf("%d年不是闰年\n", year);
    }
    return 0;
}

七、常见错误 #

7.1 混淆 & 和 && #

c
if (a & b) {
}

if (a && b) {
}

& 是位运算,&& 是逻辑运算。

7.2 连续比较 #

c
if (a < b < c) {
}

应改为:

c
if (a < b && b < c) {
}

7.3 短路副作用 #

c
#include <stdio.h>

int main() {
    int i = 0;
    
    if (i++ && i > 0) {
        printf("不会执行\n");
    }
    printf("i = %d\n", i);
    return 0;
}

由于短路求值,i++ 会执行,但 i > 0 不会。

八、总结 #

逻辑运算符 #

运算符 说明 短路特性
&& 逻辑与 第一个为假则不计算第二个
|| 逻辑或 第一个为真则不计算第二个
! 逻辑非 无短路

优先级 #

text
! > && > ||

短路求值 #

  • a && b:a为假时,不计算b
  • a || b:a为真时,不计算b

注意事项 #

  • 使用括号明确优先级
  • 注意短路求值的副作用
  • 区分位运算符和逻辑运算符

下一步,让我们学习位运算符!

最后更新:2026-03-26