### C语言关键字浅析系列 ###
### ISO/ANSI C 关键字 ###
if,几乎很多高级语言中最常见的关键字
经典的字面意思——如果。如果发生了什么,那么会怎样,就像发出了一声来自远古的神秘叩问
人生、历史,太多这样的例子了,真想把这些例子放在今天的demo里面表示出来
if的作用是:
表示if分支结构。
1、if语句的基本结构
我们来看看最简单的if语句结构,由if关键字和后面的括号及逻辑表达式组成:
int level_1 = 540; /* 某年高考一本线 */
bool flag = false; /* 通过标志,默认没通过 */
if (yourGrade >= 540) flag = true; /* 你上了一本线 */
上面的例子中,分支语句只有一条且直接跟在if语句的后面,美观起见也可以把分支语句换行并缩进
如果分支后需要执行复合语句,则需要加上大括号:
int level_1 = 540;
bool flag;
if (yourGrade >= 540)
{
flag = true; /* 你上了一本线 */
applyUniversity(); /* 申请好大学 */
haveAGoodMeal(); /* 吃大餐 */
travel(); /* 毕业旅行 */
}
2、if语句的三种形式
有时候,在条件允许的情况下你可以有多余的选择:(形式1)
purchase(); /* 超市购物 */
if (balance < 10 && balance > lollipopPrice) /* 当会员卡余额低于10块却刚好够买棒棒糖时 */
purchaseLollipop(); /* 买一个棒棒糖 */
returnHome(); /* 回家 */
很多事情面前,人还是有两条路可以走的,比如文明地赶地铁或者公交车的时候你可能有过这样的选择:(形式2)
getOn(); /* 上车 */
if (existEmptySeat()) /* 有没有空位 */
sitDown(); /* 找个空位坐 */
else
standUp(); /* 站着 */
还有很多事情面前,人有更多的选择,比如目前(2018-2019赛季)欧冠制的足球比赛:(形式3)
char result; /* 比赛结果 */
int goalOfBarca; /* 巴萨的进球 */
int goalOfJuventus; /* 尤文的进球 */
gaming(); /* 比赛 */
if (goalOfBarca > goalOfJuventus) /* 巴萨赢球 */
result = 'W';
else if(goalOfBarca < goalOfJuventus) /* 巴萨输球 */
result = 'L';
else /* 平局 */
{
result = 'T';
trainning(); /* 继续训练 */
}
可以看出if如果与else关键字配合,基本能实现所有的分支选择结构,因为他们还能嵌套:
if (buyApartment) /* 想买房 */
{
if (balance >= price) /* 够全款 */
{
purchase(); /* 拍桌子买了 */
}
else if (balance < price && balance >= deposit) /* 不够全款但够首付 */
{
loan(); /* 申请贷款 */
purchase(); /* 拍桌子买了 */
repay(); /* 还贷中 */
}
else /* 啥都不够 */
{
earning(); /* 攒钱中 */
}
}
else /* 暂时不想买房 */
{
renting(); /* 租房去 */
}
3、另一种带if的语法:#if
有时候我们会在很多项目的代码中看到这种if,它放在源文件前面的预处理指令处,但很多人不太清楚其含义和用法
比如Linux系统的内核文件就很多这样的语句,其实这是一种叫条件编译的东西,常见的有#if、#elif、#else、#endif、#ifdef、#ifndef
(1)含义:条件编译,顾名思义是可以告诉编译器哪些代码是在哪种条件下才编译的,它的出现主要是为了实现平台无关性,在调试、实现兼容、平台移植的时候,常用到条件编译。
(2)条件编译的第一种方法,用#if、#elif和#else配合实现:
#include <stdio.h>
#define FLAG 1
int main(void)
{
#if FLAG == 1 /* #if后接表达式,如果成立则编译这块下的代码 */
int a = FLAG;
printf("FLAG = %d\n", a);
#elif FLAG == 2 /* #elif可以理解为else if,表达式成立时编译这块代码 */
int a = FLAG;
a++;
printf("FLAG++=%d\n", a);
#else /* 同else,上述情况没有成立时编译这块代码 */
int a = FLAG;
a--;
printf("FLAG--=%d\n", a);
#endif /* 记得末尾加上#endif表示条件编译部分结束 */
}
/*
上述条件编译的效果在于,如果#define FLAG 1是另一个文件中声明的宏,
那么本文件将根据另一个文件中声明好的宏进行选择编译。
*/
比如在需要实现平台兼容性时,两个平台中的某源文件的某几个宏不同,需要源程序作出相应调整,但如果把所有平台的实现代码全部编译,会使得执行文件有很多“死区”,即本平台不能跑的代码部分。条件编译技术能使得源程序根据不同平台的不同宏,选择编译适合该平台的代码,既能保证开发人员对源代码的管理,又能在实现兼容的时候代码能被充分利用。
(3)条件编译的第二种方法,#ifdef和#ifndef:
#include <stdio.h>
#define FLAG 1 /* FLAG有定义 */
#define INDEX /* INDEX没定义 */
int main(void)
{
/* #ifdef表示if define,查看后面的参数是否被#define定义过了 */
#ifdef FLAG /* */
printf("FLAG has been defined.\n");
#else
printf("FLAG has not been defined.\n");
#endif
/* #ifndef表示if not define,查看后面的参数是否没有定义 */
#ifndef INDEX
printf("INDEX has not been defined.\n");
#else
printf("INDEX has been defined.\n");
#endif
}
/*
上述程序的运行结果是:
FLAG has been defined.
INDEX has not been defined.
【虽然看上去代码很多行,但其实main函数中只有两行代码被编译了】
*/
——参考《C Primer Plus第五版》
相关文章: