《编写高质量代码:改善c程序代码的125个建议》——建议18:谨慎0值比较建议18-1:避免布尔型与0或1进行比较

简介:

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

建议18:谨慎0值比较

对于0值比较,看起来似乎很简单,但实际情况并非如此,笔者曾经见过许多面试的程序员对此题的回答模棱两可。下面,我们就来讨论一下如何正确地对各类型的数据进行0值比较。

建议18-1:避免布尔型与0或1进行比较

布尔类型是计算机科学中的逻辑数据类型,它只提供两种原始值:true(真)和false(假)。通常情况下,零值为“假”,任意非零值都是“真”。
在C99的标准中,增加了一个内置的布尔类型_Bool,可以存储值1(true)和0(false)。同时,为了与C++兼容,C99还在文件中定义了宏bool、true与false,从而可以使程序员写出C与C++相互兼容的程序。
然而在C99之前(即C89中),C语言的标准并没有提供布尔类型,但这不意味着C89就不能表示布尔值的概念。其实,C语言中的所有关系运算(>、>=、<、<=、==与!=)、逻辑运算(&&、||与!)以及条件声明(if与while)等都以任意非零值代表true(真),零值代表false(假)。但是,任意非零值代表为true(真),这样就会带来了一个严重的问题,因为true由一个特定的值来表示,然而true的值究竟是什么并没有一个统一的标准。例如,在Visual C++ 中将true定义为1,而在Visual Basic中则将true定义为-1。
因此,我们将布尔类型的比较代码写成如下形式显然是不行的:

if( flag == 1 ) /* 表示flag 为真*/
if( flag == 0 ) /* 表示flag 为假*/

上面的代码虽然看起来是正确的,但不具备很好的可移植性。当然,我们也可以通过宏定义的形式来写成如下形式:
if( flag == true ) / 表示flag 为真/
if( flag == false ) / 表示flag 为假/
上面的代码虽然可读性较好,但同样也会因为true或false的不同定义值而出错。因此,正确的写法应该如下:

if( flag ) /* 表示flag 为真*/
if( !flag ) /* 表示flag 为假*/

这样就避免了上面的所有可能,并且使代码看起来也比较简洁。

相关文章