博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《编写高质量代码:改善c程序代码的125个建议》——建议17-2:避免“悬挂”的else...
阅读量:6998 次
发布时间:2019-06-27

本文共 1297 字,大约阅读时间需要 4 分钟。

本节书摘来自华章计算机《编写高质量代码:改善c程序代码的125个建议》一书中的第3章,建议17-2,作者:马 伟 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

建议17-2:避免“悬挂”的else

对于“悬挂”的else这个问题,或许大家都已经了解甚至熟知了。尽管如此,但在平时编码中还是会有许多菜鸟和老手在此为程序埋下Bug的种子,如下面的示例代码所示:

#include 
int main (void){ int a=30; int b=31; int c=7; int x=0; if(a>b) if(b

上面的代码虽然看起来比较简洁,但却给程序带来致命性错误,同时这种写作方式也是许多老手所崇拜的(if语句后省略掉花括号{})。

在上面的这段代码中,我们的本意应该有两种主要情况:a>b与a<=b。如果满足条件a>b,我们将继续判断条件b然而实际情况并非如此,这段代码所做的与我们的意图相去甚远。其根本原因就在于C语言中有这样一条规则:else始终与同一对括号内最近的未匹配的if相结合。根据这条规则,代码中的else应该与if(bb) 进行配对,所以变量x的原值没有变,依然还是0。
为了使大家能够更加清楚地看到“悬挂”的else所产生的原因以及带来的问题,我们可以通过给if/else语句加上“{}”,写成如下等价形式:

#include 
int main (void){ int a=30; int b=31; int c=7; int x=0; if(a>b) { if(b

现在,大家就能够很清楚地看到这个else 到底与谁匹配了。由此可以看出,不论是菜鸟还是老手,在什么时候都不能够偷懒,还是老老实实地把“{}”加上,这样就不会让我们迷糊了。正确的写法如下面的代码所示:

#include 
int main (void){ int a=30; int b=31; int c=7; int x=0; if(a>b) { if(b

现在,代码中的else可以正确地与第一个if(a>b) 相结合了,即使它离第二个if(b除此之外,有些C程序员也通过使用宏定义的方式来能达到类似的效果,如下面的示例代码所示:

#include 
#define IF {if(#define THEN ){#define ELSE else {#define END }int main (void){ int a=30; int b=31; int c=7; int x=0; IF a>b THEN IF b

虽然这样也可以避免“悬挂”的else这个问题,但是这样的代码却很难读懂,尤其会给后来的代码维护人员带来麻烦,所以我们不建议大家这样做。

转载地址:http://zrdvl.baihongyu.com/

你可能感兴趣的文章
HDU-1203 I NEED A OFFER!
查看>>
[HNOI2008]明明的烦恼
查看>>
SDOI2010 地精部落
查看>>
JAVA基础数据类型
查看>>
实践作业2 个人项目作业
查看>>
悲催的PHP新型字符串
查看>>
出错Can't convert 'WebElement' object to str implicitly
查看>>
转 maven 教程一 入门 (http://wentao365.iteye.com/blog/903396)
查看>>
log4net使用详解
查看>>
Oracle权限查看(转自javaeye)
查看>>
[pandas] SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
查看>>
J2EE第三课协议Protocol随课笔记
查看>>
JAVA两种XML解析方式 SAX和DOM
查看>>
zw版【转发·台湾nvp系列Delphi例程】HALCON InpaintingCt2
查看>>
POJ2155 Matrix
查看>>
【第二组】项目冲刺(Release版本)第二次每日例会 2017/7/26
查看>>
Docker笔记02-日志平台ELK搭建
查看>>
nginx url rewrite break和last的区别
查看>>
POJ - 3984 迷宫问题
查看>>
初步体验libsvm用法3(matlab实例)
查看>>