C语言学习笔记 - 56.流程控制10 - 选择6 - if语句真假判断规则

本笔记是if分支语句执行逻辑的核心基础,决定了程序在不同条件下的分支走向,结合谭浩强《C程序设计(第五版)》与郝斌C语言入门教程的核心内容整理而成。

一、if语句真假判断核心规则

C语言在C99标准前没有原生布尔类型,即使C99引入_Bool类型,其底层判断逻辑仍保持一致。if语句对括号内表达式的真假判断遵循非零即真,零为假的统一原则。

1. 条件判断的本质标准

系统判断一个表达式是否为真,仅看其数值是否为0:

  • :表达式的值为非零整数、非零浮点数、非空指针等任何非零值

  • :表达式的值严格为0 (包括整数0、浮点数0.0、空指针NULL

2. 逻辑运算结果的数值表示

当关系表达式或逻辑表达式运算产生"真"或"假"的结果时,C语言有明确的数值规定:

  • 逻辑"真"的运算结果固定为整数1

  • 逻辑"假"的运算结果固定为整数0

关键区分:

  • 判断一个量是否为真:所有非零值都是真

  • 输出一个逻辑运算的结果:只有1(真)和0(假)两种可能

二、典型场景与代码示例

1. 数值直接作为判断条件

任何数值都可以直接作为if的判断条件,系统按上述规则自动判定真假:

复制代码
#include <stdio.h>
int main() {
    if (5) {       // 非零整数,判定为真
        printf("5 is true\n");
    }
    if (0) {       // 整数0,判定为假
        printf("0 is true\n");
    }
    if (-3.14) {   // 非零浮点数,判定为真
        printf("-3.14 is true\n");
    }
    if ('a') {     // 字符'a'的ASCII码为97(非零),判定为真
        printf("'a' is true\n");
    }
    return 0;
}

运行结果:

复制代码
5 is true
-3.14 is true
'a' is true

2. 关系表达式的判断与返回值

关系表达式用于比较两个数值,其运算结果只有1(真)和0(假):

复制代码
#include <stdio.h>
int main() {
    int a = 3, b = 5;
    printf("a > b 的运算结果:%d\n", a > b);  // 3>5为假,输出0
    printf("a < b 的运算结果:%d\n", a < b);  // 3<5为真,输出1
    printf("a == 3 的运算结果:%d\n", a == 3); // 相等为真,输出1

    if (a != b) {  // 表达式值为1,执行if分支
        printf("a不等于b\n");
    }
    return 0;
}

运行结果:

复制代码
a > b 的运算结果:0
a < b 的运算结果:1
a == 3 的运算结果:1
a不等于b

3. 逻辑表达式的判断与返回值

逻辑表达式用于组合多个条件,运算结果同样只有1和0:

复制代码
#include <stdio.h>
int main() {
    int x = 10, y = 0;
    printf("x && y 的运算结果:%d\n", x && y);  // 全真才真,有假则假,输出0
    printf("x || y 的运算结果:%d\n", x || y);  // 有真则真,全假才假,输出1
    printf("!y 的运算结果:%d\n", !y);          // 取反,!0为真,输出1

    if (x > 5 && y < 10) {  // 两个条件都满足,执行if分支
        printf("复合条件成立\n");
    }
    return 0;
}

运行结果:

复制代码
x && y 的运算结果:0
x || y 的运算结果:1
!y 的运算结果:1
复合条件成立

三、常见误区与注意事项

  1. 混淆"判断真假"和"返回真假"

    错误认知:只有1才是真

    正确:if(3)if(-10)if(0.5)都等价于 if(1),都会执行if分支

  2. 浮点数的0判断陷阱

    由于浮点数存在精度误差,不能直接用 if (x == 0.0)判断浮点数是否为0,应判断其绝对值是否小于一个极小阈值:

    复制代码
    #include <math.h>  // 需包含头文件使用fabs函数
    if (fabs(x) < 1e-6) {  // 正确判断浮点数是否近似为0
        printf("x is approximately zero\n");
    }
  3. 赋值与比较的笔误

    赋值表达式的值等于赋值后变量的值,因此 if (a = 5)等价于 if(5),永远为真,这是初学者最常见的笔误(本应写相等比较 a == 5)。

四、参考出处

  1. 《C程序设计(第五版)谭浩强》:第4章 4.3 关系运算符和关系表达式、4.4 逻辑运算符和逻辑表达式

  2. 郝斌-C语言自学入门教程:第5章 流程控制 - if语句基础