设为首页 加入收藏

TOP

建议1:区分0的4种面孔
2013-10-07 14:46:31 来源: 作者: 【 】 浏览:59
Tags:建议 1:区分 面孔

建议1:区分0的4种面孔

0在C/C++(www.cppentry.com)语言中绝对是一个多面手,它扮演着多样的角色,拥有着多种面孔。总结起来包括以下几种角色:整型0、空指针NULL、字符串结束标志 '\0'、逻辑FALSE/false,不同的角色适用于不同的情形,下面我们按照上述顺序一一介绍。

整型0

这是我们最熟悉的一个角色。作为一个int类型,整型0占据32位的空间,其二进制表示为:

  1. 00000000 00000000 00000000 00000000 

它的使用方式最为简单直接,未经修饰,如下所示:
  1. int nNum = 0;  // 赋值  
  2. if( nNum == 0 ) // 比较 

空指针NULL

NULL是一个表示空指针常量的宏,在C/C++(www.cppentry.com)标准中有如下阐述:

在文件<clocale>、<cstddef>、<cstdio>、<cstdlib>、<cstring>、<ctime>或者<cwchar>中定义的NULL宏,在国际标准中被认为是C++(www.cppentry.com)空指针常量。

指针与int类型所占空间是一样的,都是32位。那么,空指针NULL与0又有什么区别呢?还是让我们看一下windef.h中NULL的定义吧:

  1. #ifndef NULL  
  2. #ifdef __cplusplus   
  3. #define NULL 0  
  4. #else  
  5. #define NULL ((void *)0)  
  6. #endif  
  7. #endif 

通过定义我们可以看出,它们之间其实是没有太大的区别,只不过在C语言中定义NULL时会进行一次强制转型。我想之所以创造出NULL,大概是为了增强代码的可读性,但这只是我的臆测,无从考究。

需要注意的是,这里的0与整型的0还是存在区别的。例如,int* pValue = 0;是合法的,而int* pValue = 1;则是不合法的。这是因为0可以用来表示地址,但常数1绝对不行。

作为指针类型时,推荐按照下面的方式使用0:

  1. float* pNum = NULL;  // 赋值  
  2. if( pNum == NULL ) // 比较 

字符串结束标志'\0'

'\0'与上述两种情形有所不同,它是一个字符。作为字符,它仅仅占8位,其二进制表示为:

  1. 00000000 

因为字符类型中并没有与0000 0000对应的字符,所以就创造出了这么一个特殊字符。(对于类似'\0'这样的特殊字符,我们称之为转义字符。)在C/C++(www.cppentry.com)中,'\0'被作为字符串结束标志来使用,具有唯一性,与'0'是有区别的。

作为字符串结束符,0的使用有些特殊。不必显式地为字符串赋值,但是必须明确字符串的大小。例如,在下面的代码中,“Hello C/C++(www.cppentry.com)”只有11个字符,却要分配12个字符的空间。

  1. char sHello[12] = {"Hello C/C++(www.cppentry.com)"};  // 赋值  
  2. if( sHello[11] == '\0' )  // 比较 

逻辑FALSE/false

虽然将FALSE/false放在了一起,但是你必须清楚FALSE和false之间不只是大小写这么简单的差别。false/true是标准C++(www.cppentry.com)语言里新增的关键字,而FALSE/TRUE是通过#define定义的宏,用来解决程序在C与C++(www.cppentry.com)环境中的差异。以下是FALSE/TRUE在windef.h中的定义:

  1. #ifndef FALSE  
  2. #define FALSE 0  
  3. #endif  
  4. #ifndef TRUE  
  5. #define TRUE 1  
  6. #endif 

换言之,FALSE/TRUE是int类型,而false/true是bool类型,两者是不一样的,只不过C++(www.cppentry.com)帮我们完成了相关的隐式转换,以至于我们在使用中没有任何感觉。bool在C++(www.cppentry.com)里占用的是1个字节,所以false也只占用1个字节。

其二进制表示如下:

  1. false -> 0  
  2. FALSE -> 00000000 00000000 00000000 00000000 

在C++(www.cppentry.com)中,推荐使用bool类型的false/true,其使用方式如下:
  1. bool isReady = false; // 赋值  
  2. if( isReady )   // 判断 

如果不够细心,0的多重性可能会让程序产生一些难以发现的Bug,比如:
  1. // 把pSrc指向的源字符串复制到pDes指向的内存块  
  2. while(pSrc)  
  3. {   
  4.    * pDes ++ = * pSrc ++;   
  5. }  

正常情况下,当pSrc指向的字符为字符串结束符'\0'时,while循环终止;但不幸的是,这里的条件写错了,while终止条件变成了pSrc指向地址0。结果while循环写入到内存中了,直至程序崩溃。

正确的写法应该是:

  1. // 把pSrc指向的源字符串复制到pDes指向的内存块中  
  2. while(*pSrc)  
  3. {   
  4.    * pDes ++ = * pSrc ++;   

请记住:

由于0存在多种面孔,容易让不细心的程序员产生混乱。唯一的解决办法就是在使用0的时候小心一点,再小心一点。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇第1章 从C继承而来的 下一篇4.4.1 High Scores程序简介

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: