1. 分支结构
之前,我们学习过程序中的分支结构。在预处理中,也有类似的分支结构。我们先写一个顺序结构的代码。
#include <stdio.h>
int main()
{
printf("111111\n");
printf("222222\n");
printf("333333\n");
printf("AAAAAA\n");
printf("BBBBBB\n");
printf("CCCCCC\n");
return 0;
}
程序将从上到下执行代码,依次调用打印1、2、3、A、B、C的函数printf
。
现在,我们将这个代码改为分支结构。使用if
关键词,配合if
括号里面的表达式。若表达式结果为真,即执行if
下面一条语句,否则跳过。若需要多条语句,使用花括号将多条语句组合成一条复合语句。
#include <stdio.h>
int main()
{
int n = 0;
if (n == 1)
{
printf("111111\n");
printf("222222\n");
printf("333333\n");
}
printf("AAAAAA\n");
printf("BBBBBB\n");
printf("CCCCCC\n");
return 0;
}
由于n的值为0,表达式n == 1
的结果为假。所以,将跳过if
下的一条语句,花括号内的函数printf
将均不会执行。
2. 预处理中的分支结构
2.1 #if
在程序中运用分支结构这个知识点我们已经学过了。但是,下面我们需要将分支结构运用在预处理中。
还是沿用之前程序分支结构中的if
关键词。不过,由于现在我们需要的是预处理指令。所以,在if
关键词前加一个#
,即#if
。现在,它从一个C语言关键词,变成了一个预处理指令了。#if
后无需括号,直接填写条件表达式,并用空格隔开。
不同于if
,#if
要求条件表达式为一个常量表达式。常量表达式中不允许出现变量。
由于预处理指令中不使用花括号,无法将多条语句组成一条复合语句,所以需要用#endif
指令标记指令块结束。并且,就算#if
下仅有一条语句,也需要使用#endif
标记指令块结束。
#include <stdio.h>
#define N 0
int main()
{
#if N == 1 // 常量表达式,无需括号
printf("111111\n");
printf("222222\n");
printf("333333\n");
#endif // 必须使用#endif标记指令块结束
printf("AAAAAA\n");
printf("BBBBBB\n");
printf("CCCCCC\n");
return 0;
}
你肯定会有疑惑,为什么有了if
关键词,还需要使用预处理指令#if
呢?
下面我们将分析它们之间的差异。
预处理中的#if
:
预处理指令将在编译前,由预处理器处理。预处理器根据预处理指令的意图,修改代码。类似于#define
指令,替换代码中出现的宏。#if
指令会根据分支的走向,保留需要走向分支的代码,删除被跳过分支的代码。
关键词if
:
编译后,程序运行时,计算条件表达式的结果。根据表达式结果,让程序走向不同的分支。
例如,上面那段代码经过预处理后,将被修改为如下代码:
#include <stdio.h>
int main()
{
printf("AAAAAA\n");
printf("BBBBBB\n");
printf("CCCCCC\n");
return 0;
}