C++编程 - 不存在也是一种存在的0

 

 

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/MFCafx.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 类型是一种伪布尔类型。布尔类型只有01. BOOL 0和非0的区别,具有多个离散值。即使将 BOOL 类型变量赋值一个大于1的数的也没问题,当然这样做是不提倡的。真正的布尔是booltrue false 的区别,大多数情况非0等同于true0等同于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位的所以long4个字节,232次方是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值将是10255254,因为BYTE取值是0255,无论是什么值都满足条件。

所以得换个数据类型做比较。

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西笑生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值