一. 先从void说起
void 顾名思义,空的意思,在编写C++程序入口函数main的时候,我们经常会看到这样的代码:
void main() { //some code... }
在VC++平台中是可以正确编译,链接,执行的,但是在Linux环境下却会产生异常,这里会是怎么回事呢?原因恐怕有二。
其一:市面上一些经典书籍的误导,一个非常有代表性的就是谭浩强的C程序设计。当我后来接触到一些国外经典书籍的时候发现该书在一些概念上有太多歧义,不建议初学者使用该书籍,可以用C++编程思想等经典书籍。
其二:微软对于这种行为的过度纵容,导致很多编程人员认为这也是合理的,但是首先我们要清楚在C/C++中从来就没有void main()这样的代码形式,C++之父Bjarne Stroustrup曾经明确的指出:在C++中绝对没有出现过void main(){}这样的函数定义,在C语言中也是。
虽然在C/C++标准中并不支持void main(),但是在一些编译器中还是会通过编译执行的,比如微软的VC++,由于VC++平台受众众多,因此这一不良风气一直在蔓延,但是在gcc中,这是无法通过编译的,因此强烈建议使用标准中的定义:
int main(void)
{
//some code.....
return 0;
}
int main(int argc,char *argv[])
{
//some code
return 0;
}
使用标准的一个最大的好处就是消除了当把程序从一个编译器平台转移到另一个编译器平台的时候可能出现的编译错误。
二.0的几种形态
1.整形0
作为一个int类型,其占据了32位的空间,其余无需多说
2.空指针NULL
NULL是一个宏,表示空指针常量,我们看一下其在windef.h中的定义:
#ifndef NULL
#ifdef _cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
需要注意的是,这里的0与整数还是有区别的,因为这里的NULL除了可以表示0还可以是地址,也即这里的0扩大了其他整数无法办到的范围,如下:
int * pnum=0;//这是合法的
int* pnum=1;//这是非法的
3.字符串结束标志’\0’
字符’\0’,仅仅作为一个字符,其占8位,在C++中唯一用作字符串结束标志,通常来说,我们在这里要注意的就是字符的空间要比length要多一位
4.逻辑false/FALSE
在这里有一点需要注意,也即false与FALSE的区别,可能我们在使用的过程中丝毫没有觉得有何差异,但是其内在构成是不同的。我们可以做一个简单的实验:
在C++中我们可以通过库函数typeid(a)来判断变量a的类型,该函数位于#include <typeinfo.h>中:我们看下面的一段代码,这里的问题立马就解决了。
#include <iostream>
#include <typeinfo.h>
#include <Windows.h>
#include <WinDef.h>
int main(void)
{
if (typeid(false)==typeid(FALSE))
std::cout<<"false&FALSE are equally!"<<std::endl;
else
std::cout<<"false&FALSE are not equally!"<<std::endl;
////////////////////////////////
if (typeid(false)==typeid(bool))
std::cout<<"false is bool!"<<std::endl;
else
std::cout<<"false is not bool!"<<std::endl;
////////////////////////////////
if (typeid(FALSE)==typeid(int))
std::cout<<"FALSE is int!"<<std::endl;
else
std::cout<<"FALSE is not int!"<<std::endl;
system("pause");
return 0;
}
从这里我们可以看出false与FALSE是不同的,其实false是C++标准后来增加的,而FALSE则是宏,是整型,占4个字节,而false则是bool型,只占1个字节,这一点要切记。