C++编程 - 不存在也是一种存在的零
2012/12/18 flyfish
不存在也是一种存在
1 二进制系统是现代计算机的基础,在计算机中所有的事物都可以用0和1表示,代价就是0和1的序列会非常的长。罗马数字系统里面没有0,如果用罗马数字系统来构建计算机呢?
2如何以非算术规则来理解0呢?
1除以 1/10 =10
1除以 1/100 =100
1除以 1/1000 =1000
1除以 1/10000 =10000
1除以 1/100000 =100000
那么1 除以 0 结果是接近无穷大
如果 0 ÷1=0的方式处理 1 ÷ 0 =x, 以分数形式交叉相乘,结果是毫无意义的 0=1,
允许 1 ÷0的存在就是个灾难。
假设 0 ÷ 0=x,交叉相乘 x等于任何数,那么如果计算机处理0÷ 0那么就rand随机产生一个数字给用户,但
这种情况是不会放生的,此处无论哪个程序员都会排除0作为除数的情况。
2 一个存储介质首先是处于空的状态,之后里面存储了0和1的状态,这样文件就被创造了出来,读出0和1的状
态,通过0和1个数及排列,我们人为地为这个文件的赋上了意义,文件传输时,只需要得到这个文件的0和1的
序列。
好似道生一,一生二,二生三,三生万物。从简单开始,慢慢开始复杂,最后追求原始的简单状态。
程序中的零
#define NULL 0
该定义在VC/MFC中afx.h 头文件中
null 单词用金山词霸-行业释义-计算机中的意思是空值;零;无;空行;无意义
将空赋予0
1静态局部变量
假设定义一个静态局部变量,不进行初始化。
staticintnTest;
结果将是0
2数组
定义一个整形数组 int nArray[1];
数组的下标从0开始
虽然C++语言提倡使用vector来替代数组,但由于已经存在的软件中仍然使用数组,如果想取代将是一个十分漫长的过程。
数组的维数不能为0,如果定义int nArray[0];
编译器将提示不能分配常量大小为0的数组
3枚举
定义一个枚举类型 enum eTest{First,Second};
如果不对枚举元素进行赋值操,那么枚举元素将自动从0开始递增。
4指针
定义一个指针变量 int *pn=0;
这里0表示一个地址,等同NULL,表示pn不指向任何对象。C++中现在缺个 null 关键字为指针初始化,使用int *pn 在释放内存之后别忘了把指针指向 NULL.指针比较强大也容易带来隐患,所以C++引入了一个“引用”的概念。
5字符串结束
字符串结束‘\0’
‘\0’ 这是个转义字符,不是字符‘0’。
处理C风格的字符串,就需要牢记这个‘\0’,传统的处理字符串函数例如strcpy 在VC高版本IDE中都增加了 _s,例如strcpy_s 以防止没有足够的空间存储新的字符串,C++提倡使用标准库的string来替代C风格的字符串
6 布尔
#define FALSE 0
#define TRUE 1
BOOL 类型是一种伪布尔类型。布尔类型只有0和1.而 BOOL 是0和非0的区别,具有多个离散值。即使将 BOOL 类型变量赋值一个大于1的数的也没问题,当然这样做是不提倡的。真正的布尔是bool有true 和false 的区别,大多数情况非0等同于true,0等同于false
CFile f;
CFileException e;
TCHAR* pszFileName = _T("Open_File.dat");
if(!f.Open(pszFileName,CFile::modeCreate | CFile::modeWrite, &e))
{
TRACE(_T("File could not beopened %d\n"),e.m_cause);
}
下面这个例子就是不是这种情况了
在Windows编程中HANDLE的值为0或者NULL表示一个空的句柄,但并不是所有的情况都正确的例如
HANDLEWINAPI CreateFile
If thefunction fails, the return value isINVALID_HANDLE_VALUE,如果函数调用失败将返回INVALID_HANDLE_VALUE
#define INVALID_HANDLE_VALUE((HANDLE)(LONG_PTR)-1)
typedef_W64long LONG_PTR, *PLONG_PTR;
如果系统是32位的所以long是4个字节,2的32次方是4294967296,减去1就是4294967295,换成16进制就是0xFFFFFFFF,所以返回值不能跟0做比较, 要跟INVALID_HANDLE_VALUE 做比较.
7 浮点0的比较
constdouble dFirst=0.123456;
constdouble dSecond=0.123456;
if ( 0== (dFirst*dSecond-0.015241383936))
{
//输出内容
}
VC2010 编译之后看不到输出内容因为在计算机中浮点的0是一个非常小,接近于0的值。
8 与BYTE的比较
BYTEnCount=1;
while(0<=nCount)
{
nCount--;
}
这是一个死循环
如果在循环体中输入nCount值将是1,0,255,254,因为BYTE取值是0到255,无论是什么值都满足条件。
所以得换个数据类型做比较。