关于 C 的 if 分支问题
正常的,当我们第一次接触 if 语句时,都默认它会判断 () 内的条件正确与否,并自动执行对应的分支。
但是,if 语句并非能自己判断条件,它只是判断 () 内的值是 0 还是非 0:
- 读到 非 0(比如 1)→ 执行
if下的语句 - 读到 0 → 执行
else下的语句
这听起来很奇怪,但确实如此。
举个例子
你可以自己试一试:if(1) 会执行哪一条?if(0) 又是哪一条?
#include <stdio.h>
int main() {
if (1) {
printf("if(1) 会执行这里\n");
} else {
printf("if(1) 不会执行这里\n");
}
if (0) {
printf("if(0) 不会执行这里\n");
} else {
printf("if(0) 会执行这里\n");
}
return 0;
}
运行结果:
if(1) 会执行这里
if(0) 会执行这里
更进一步
既然 if 只看 0 / 非 0,那么函数的返回值也可以放进 if() 里——就像主函数的 return 0; 一样:
int is_ok() {
return 1; // 返回 1,表示“真”
}
if (is_ok()) {
// 函数返回非 0,继续执行
} else {
// 函数返回 0 时,才会执行这里
}
那么,是谁来判断 1/0 呢?
这跟 CPU 有关。提前透露一点:CPU 内部有一个状态寄存器,里面的标志位(比如 ZF 零标志)会记录运算结果是否为 0;if 最终会被编译成「条件跳转」指令,CPU 就是根据这些标志位来决定跳不跳转的。
等我们学到计算机组成原理之后,就能彻底明白了。
记住这个结论:C 语言里,0 为假,非 0 为真,if 只是检查这个结果。