if语句包含零个或多个elif子句,及可选的else子句。If语句只会匹配一个表达式,一旦匹配上某一个,则结束匹配。- 如果表达式的值为真(即非 0),那么执行程序语句 1,否则执行程序语句 2。
布尔值
在数学当中我们都学习过命题的真假的逻辑,程序语言的判断其实也是判断命题真假的过程。在 C 语言当中,C90 并未定义布尔值类型,但布尔值确实客观存在的,于是 C 语言当中的布尔值使用整型来表达,即 0 为假,非 0 为真。
在实际开发当中,我们也经常使用整型来模拟布尔类型,例如:
#include <stdio.h>#define BOOL char#define TRUE 1#define FALSE 0int main(void) {BOOL is_enabled = TRUE;printf("is enabled: %d\n", is_enabled);is_enabled = FALSE;printf("is enabled: %d\n", is_enabled);return 0;}
首先我们定义了一个宏 BOOL,它本质上就是 char 类型。我们之所以这样做,是为了让 is_enabled 这个变量的意图更加明显,让代码阅读者一眼就能明白这个变量即将用于布尔类型的场景。
接着我们又定义了两个宏,用于指代布尔值的真和假。由于我们这里只能使用整数类型来模拟布尔类型,因此把真和假的值分别映射为 1 和 0。
通常来说这样做问题不大,不过如果我们对 is_enabled 执行整数类型的运算,例如自增或者自减,那么结果可能将是灾难性的,试想一下当 is_enabled 的值为 1000 时的场景,它既不等于 TRUE,也不等于 FALSE。
所以 C99 标准加入了对布尔类型的支持,并新增了关键字 _Bool 作为布尔类型的名字。可能 C 语言标准委员会也觉得 _Bool 这个名字太丑了,于是在 stdbool.h 这个标准库的头文件中添加了以下三个宏:
#define bool _Bool#define true 1#define false 0
除了以标准的形式给出 true 和 false 的宏定义以外,也将 bool 作为 _Bool 的别名,这样看起来似乎更接近其他类型的命名。
[C99]#include <stdio.h>#include <stdbool.h>int main(void) {bool is_enabled = true;printf("is enabled: %d\n", is_enabled);is_enabled = false;printf("is enabled: %d\n", is_enabled);return 0;}
我们将编译器的配置从 C90 改成 C99,运行以上程序,发现与之前我们使用 char 类型模拟的 BOOL 类型没什么差别啊。
不过如果我们对 is_enabled 做一些整型运算,结果又如何呢?
#include <stdio.h>#include <stdbool.h>int main(void) {bool is_enabled = true;printf("is enabled: %d\n", is_enabled);is_enabled = false;printf("is enabled: %d\n", is_enabled);is_enabled += 1000;printf("is enabled: %d\n", is_enabled);return 0;}
运行结果如下:
is enabled: 1is enabled: 0is enabled: 1
发现没有,即便我们给 is_enabled 加了 1000,它的值仍然是 1,这说明 C99 中的 _Bool 类型是真的布尔类型,它的值只有 0 或 1 两种可能。
所以有条件使用 C99 的同学,可以考虑优先使用 _Bool,而仍然在 C90 环境中挣扎的同学,那就只能自己多加小心了。
if语句
只有一种选择
#include <stdio.h>int main(){int a = 1;int b = 2;if (a < b){printf("%d\n", a);}return 0;}
if…else语句
二选一
#include <stdio.h>int main(){int a = 1;int b = 2;if (a > b){printf("%d\n", a);}else{printf("%d\n", b);}return 0;}
if…else if语句
多选一
#include <stdio.h>int main(){unsigned int a;scanf("%u", &a);if (a < 10){printf("个位\n");}else if (a < 100){printf("十位\n");}else if (a < 1000){printf("百位\n");}return 0;}
if…else if…else语句
多选一
#include <stdio.h>int main(){unsigned int a;scanf("%u", &a);if (a < 10){printf("个位\n");}else if (a < 100){printf("十位\n");}else if (a < 1000){printf("百位\n");}else{printf("很大\n");}return 0;}
// 猜数字#include <stdio.h>#include <stdlib.h>#include <time.h>int main() {// 1. random number// [0, 0x7fff]srand(time(NULL));int magic_number = rand();// 2. loopwhile (1) {int user_input;puts("Please input a number: ");scanf("%d", &user_input);if (user_input > magic_number) {puts("Your number is bigger!");} else if (user_input < magic_number) {puts("Your number is smaller!");} else {puts("Yes! You got it!");break;}}return 0;}
