if
语句包含零个或多个elif
子句,及可选的else
子句。If
语句只会匹配一个表达式,一旦匹配上某一个,则结束匹配。- 如果表达式的值为真(即非 0),那么执行程序语句 1,否则执行程序语句 2。
布尔值
在数学当中我们都学习过命题的真假的逻辑,程序语言的判断其实也是判断命题真假的过程。在 C 语言当中,C90 并未定义布尔值类型,但布尔值确实客观存在的,于是 C 语言当中的布尔值使用整型来表达,即 0 为假,非 0 为真。
在实际开发当中,我们也经常使用整型来模拟布尔类型,例如:
#include <stdio.h>
#define BOOL char
#define TRUE 1
#define FALSE 0
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;
}
首先我们定义了一个宏 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: 1
is enabled: 0
is 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. loop
while (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;
}