• if语句包含零个或多个 elif 子句,及可选的 else 子句。
  • If语句只会匹配一个表达式,一旦匹配上某一个,则结束匹配。
  • 如果表达式的值为真(即非 0),那么执行程序语句 1,否则执行程序语句 2

布尔值

在数学当中我们都学习过命题的真假的逻辑,程序语言的判断其实也是判断命题真假的过程。在 C 语言当中,C90 并未定义布尔值类型,但布尔值确实客观存在的,于是 C 语言当中的布尔值使用整型来表达,即 0 为假,非 0 为真。
在实际开发当中,我们也经常使用整型来模拟布尔类型,例如:

  1. #include <stdio.h>
  2. #define BOOL char
  3. #define TRUE 1
  4. #define FALSE 0
  5. int main(void) {
  6. BOOL is_enabled = TRUE;
  7. printf("is enabled: %d\n", is_enabled);
  8. is_enabled = FALSE;
  9. printf("is enabled: %d\n", is_enabled);
  10. return 0;
  11. }

首先我们定义了一个宏 BOOL,它本质上就是 char 类型。我们之所以这样做,是为了让 is_enabled 这个变量的意图更加明显,让代码阅读者一眼就能明白这个变量即将用于布尔类型的场景。
接着我们又定义了两个宏,用于指代布尔值的真和假。由于我们这里只能使用整数类型来模拟布尔类型,因此把真和假的值分别映射为 1 和 0。
通常来说这样做问题不大,不过如果我们对 is_enabled 执行整数类型的运算,例如自增或者自减,那么结果可能将是灾难性的,试想一下当 is_enabled 的值为 1000 时的场景,它既不等于 TRUE,也不等于 FALSE。
所以 C99 标准加入了对布尔类型的支持,并新增了关键字 _Bool 作为布尔类型的名字。可能 C 语言标准委员会也觉得 _Bool 这个名字太丑了,于是在 stdbool.h 这个标准库的头文件中添加了以下三个宏:

  1. #define bool _Bool
  2. #define true 1
  3. #define false 0

除了以标准的形式给出 true 和 false 的宏定义以外,也将 bool 作为 _Bool 的别名,这样看起来似乎更接近其他类型的命名。

  1. [C99]
  2. #include <stdio.h>
  3. #include <stdbool.h>
  4. int main(void) {
  5. bool is_enabled = true;
  6. printf("is enabled: %d\n", is_enabled);
  7. is_enabled = false;
  8. printf("is enabled: %d\n", is_enabled);
  9. return 0;
  10. }

我们将编译器的配置从 C90 改成 C99,运行以上程序,发现与之前我们使用 char 类型模拟的 BOOL 类型没什么差别啊。
不过如果我们对 is_enabled 做一些整型运算,结果又如何呢?

  1. #include <stdio.h>
  2. #include <stdbool.h>
  3. int main(void) {
  4. bool is_enabled = true;
  5. printf("is enabled: %d\n", is_enabled);
  6. is_enabled = false;
  7. printf("is enabled: %d\n", is_enabled);
  8. is_enabled += 1000;
  9. printf("is enabled: %d\n", is_enabled);
  10. return 0;
  11. }

运行结果如下:

  1. is enabled: 1
  2. is enabled: 0
  3. is enabled: 1

发现没有,即便我们给 is_enabled 加了 1000,它的值仍然是 1,这说明 C99 中的 _Bool 类型是真的布尔类型,它的值只有 0 或 1 两种可能。
所以有条件使用 C99 的同学,可以考虑优先使用 _Bool,而仍然在 C90 环境中挣扎的同学,那就只能自己多加小心了。

if语句

只有一种选择
image.png

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a = 1;
  5. int b = 2;
  6. if (a < b)
  7. {
  8. printf("%d\n", a);
  9. }
  10. return 0;
  11. }

if…else语句

二选一
image.png

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a = 1;
  5. int b = 2;
  6. if (a > b)
  7. {
  8. printf("%d\n", a);
  9. }
  10. else
  11. {
  12. printf("%d\n", b);
  13. }
  14. return 0;
  15. }

if…else if语句

多选一

  1. #include <stdio.h>
  2. int main()
  3. {
  4. unsigned int a;
  5. scanf("%u", &a);
  6. if (a < 10)
  7. {
  8. printf("个位\n");
  9. }
  10. else if (a < 100)
  11. {
  12. printf("十位\n");
  13. }
  14. else if (a < 1000)
  15. {
  16. printf("百位\n");
  17. }
  18. return 0;
  19. }

if…else if…else语句

多选一
image.png

  1. #include <stdio.h>
  2. int main()
  3. {
  4. unsigned int a;
  5. scanf("%u", &a);
  6. if (a < 10)
  7. {
  8. printf("个位\n");
  9. }
  10. else if (a < 100)
  11. {
  12. printf("十位\n");
  13. }
  14. else if (a < 1000)
  15. {
  16. printf("百位\n");
  17. }
  18. else
  19. {
  20. printf("很大\n");
  21. }
  22. return 0;
  23. }
  1. // 猜数字
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. int main() {
  6. // 1. random number
  7. // [0, 0x7fff]
  8. srand(time(NULL));
  9. int magic_number = rand();
  10. // 2. loop
  11. while (1) {
  12. int user_input;
  13. puts("Please input a number: ");
  14. scanf("%d", &user_input);
  15. if (user_input > magic_number) {
  16. puts("Your number is bigger!");
  17. } else if (user_input < magic_number) {
  18. puts("Your number is smaller!");
  19. } else {
  20. puts("Yes! You got it!");
  21. break;
  22. }
  23. }
  24. return 0;
  25. }