C语言关键字浅析-if

### 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第五版》

 

相关文章:

C语言关键字浅析-else

 

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值