本笔记是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才是真
正确:
if(3)、if(-10)、if(0.5)都等价于if(1),都会执行if分支 -
浮点数的0判断陷阱
由于浮点数存在精度误差,不能直接用
if (x == 0.0)判断浮点数是否为0,应判断其绝对值是否小于一个极小阈值:#include <math.h> // 需包含头文件使用fabs函数 if (fabs(x) < 1e-6) { // 正确判断浮点数是否近似为0 printf("x is approximately zero\n"); } -
赋值与比较的笔误
赋值表达式的值等于赋值后变量的值,因此
if (a = 5)等价于if(5),永远为真,这是初学者最常见的笔误(本应写相等比较a == 5)。
四、参考出处
-
《C程序设计(第五版)谭浩强》:第4章 4.3 关系运算符和关系表达式、4.4 逻辑运算符和逻辑表达式
-
郝斌-C语言自学入门教程:第5章 流程控制 - if语句基础