在 C 语言中,“条件”是程序做出决策和执行不同代码路径的核心,它通常与 if、else if、else 语句以及 switch 语句结合使用,以控制程序的流程。

(图片来源网络,侵删)
条件判断的本质:真与假
在 C 语言中,任何值都可以被用作一个条件,其判断规则非常简单:
- “真”(True):任何非零的值都被认为是“真”。
1,-10,14,5(非零整数) 都是“真”。- 指针(只要不是空指针
NULL)也是“真”。
- “假”(False):唯一的“假”
0。0,0,'\0'(空字符) 都是“假”。
示例:
#include <stdio.h>
int main() {
int a = 10;
int b = 0;
if (a) { // a 的值是 10 (非零),所以条件为真
printf("a is true.\n"); // 这行会被执行
}
if (b) { // b 的值是 0,所以条件为假
printf("b is true.\n"); // 这行不会被执行
}
if (!b) { // ! 是逻辑非运算符,!0 等于 1 (真)
printf("b is false.\n"); // 这行会被执行
}
return 0;
}
关系运算符
关系运算符用于比较两个值,并返回一个结果(1 代表真,0 代表假),这个结果通常用作 if 语句的条件。
| 运算符 | 名称 | 示例 | 描述 |
|---|---|---|---|
| 等于 | a == b |
a 等于 b,结果为 1 (真) |
|
| 不等于 | a != b |
a 不等于 b,结果为 1 (真) |
|
> |
大于 | a > b |
a 大于 b,结果为 1 (真) |
< |
小于 | a < b |
a 小于 b,结果为 1 (真) |
>= |
大于或等于 | a >= b |
a 大于或等于 b,结果为 1 (真) |
<= |
小于或等于 | a <= b |
a 小于或等于 b,结果为 1 (真) |
⚠️ 特别注意: (等于) 和 (赋值) 是两个完全不同的运算符,初学者非常容易混淆。
if (x == 5):判断x的值是否等于5。if (x = 5):将5赋值给x,然后判断x的值(此时为5,非零,所以为真),这通常是一个逻辑错误,但 C 编译器会把它当作合法代码,导致难以发现的 bug。
逻辑运算符
当需要组合多个条件时,可以使用逻辑运算符。

(图片来源网络,侵删)
| 运算符 | 名称 | 示例 | 描述 |
|---|---|---|---|
&& |
逻辑与 | condition1 && condition2 |
与:只有当 condition1 和 condition2 都为真时,整个表达式才为真。 |
| 逻辑或 | condition1 || condition2 |
或:只要 condition1 或 condition2 有一个为真,整个表达式就为真。 |
|
| 逻辑非 | !condition |
非:condition 为真,则 !condition 为假;反之亦然。 |
短路求值
C 语言在计算逻辑表达式时采用“短路求值”策略,这可以提高效率并避免潜在错误。
-
对于
&&(与):- 如果第一个条件为假,整个表达式必然为假,因此不会再去计算第二个条件。
- 示例:
if (a != 0 && (b / a) > 2)。a为0,第一个条件a != 0为假,程序不会执行(b / a),从而避免了“除以零”的错误。
-
对于 (或):
- 如果第一个条件为真,整个表达式必然为真,因此不会再去计算第二个条件。
- 示例:
if (x > 10 || check_file_exists())。x大于10,第一个条件为真,程序不会调用check_file_exists()函数,节省了时间。
if-else 语句
这是最基本、最常用的条件结构。

(图片来源网络,侵删)
a) if 语句
如果条件为真,则执行代码块。
if (条件) {
// 如果条件为真,则执行这里的代码
}
b) if-else 语句
如果条件为真,执行 if 代码块;否则,执行 else 代码块。
if (条件) {
// 如果条件为真,执行这里的代码
} else {
// 如果条件为假,执行这里的代码
}
c) if-else if-else 语句
用于检查多个互斥的条件,一旦某个条件为真,就执行对应的代码块,并跳过后续的 else if 和 else。
if (条件1) {
// 如果条件1为真,执行这里的代码
} else if (条件2) {
// 如果条件1为假,且条件2为真,执行这里的代码
} else if (条件3) {
// 如果条件1和条件2都为假,且条件3为真,执行这里的代码
} else {
// 如果以上所有条件都为假,执行这里的代码
}
完整示例
#include <stdio.h>
int main() {
int score = 85;
if (score >= 90) {
printf("Grade: A\n");
} else if (score >= 80) {
printf("Grade: B\n"); // 这行会被执行
} else if (score >= 70) {
printf("Grade: C\n");
} else {
printf("Grade: F\n");
}
return 0;
}
switch 语句
switch 语句用于处理基于单个变量的多个离散值的情况,它通常可以替代复杂的 if-else if-else 结构。
switch (表达式) {
case 常量1:
// 如果表达式的值等于 常量1,执行这里的代码
break; // 跳出 switch
case 常量2:
// 如果表达式的值等于 常量2,执行这里的代码
break;
default:
// 如果表达式的值不匹配任何一个 case,执行这里的代码
break;
}
关键规则:
- 表达式类型:
switch后的表达式必须是整型(int,char,long等)或枚举类型。 case:每个case后的值必须是常量或常量表达式,不能是变量。break语句:case分支中没有break,程序会继续执行下一个case的代码,这被称为“贯穿”(fall-through),虽然有时会故意利用它,但初学者最好养成在每个case末尾加上break的习惯。default分支:是可选的,当没有任何case匹配时执行。
示例
#include <stdio.h>
int main() {
char grade = 'B';
switch (grade) {
case 'A':
printf("Excellent!\n");
break;
case 'B':
printf("Good job!\n"); // 这行会被执行
break;
case 'C':
printf("Pass.\n");
break;
default:
printf("Invalid grade.\n");
break;
}
return 0;
}
三目运算符 (?:)
这是一种简洁的条件表达式,可以看作是 if-else 的一行写法。
语法:
条件 ? 表达式1 : 表达式2
执行逻辑:
条件 为真,整个表达式的结果为 表达式1 的值;否则,结果为 表达式2 的值。
示例
#include <stdio.h>
int main() {
int a = 10;
int b = 20;
int max;
// 使用 if-else
if (a > b) {
max = a;
} else {
max = b;
}
printf("Max (if-else): %d\n", max);
// 使用三目运算符
max = (a > b) ? a : b;
printf("Max (ternary): %d\n", max);
// 另一个例子:打印消息
(a > 0) ? printf("a is positive.\n") : printf("a is not positive.\n");
return 0;
}
| 特性 | 描述 |
|---|---|
| 判断基础 | 任何非零值为真,零为假。 |
| 关系运算符 | , , >, <, >=, <=,用于比较,返回 1 (真) 或 0 (假)。 |
| 逻辑运算符 | && (与), (或), (非),用于组合条件,支持短路求值。 |
if-else |
最灵活的条件结构,可以处理任意复杂的逻辑判断。 |
switch |
适用于基于单个整型变量的多分支选择,结构清晰。 |
| 三目运算符 | 条件 ? 值1 : 值2,是 if-else 的简洁形式,适用于简单的赋值或返回场景。 |
理解并熟练运用这些条件语句是编写逻辑清晰、功能强大的 C 语言程序的基础。
