关于程序语言中零的总结

关于程序语言中零的总结

 
人 类在一开始发明了数字时并没有零这个概念,因为零表示无,既然是无,为什么要用一个符号来表示它呢。没有零的数学世界,所有的加减乘除异常的困难,一道两 个百位数相乘的题目,在当时只有世界上最顶尖的数学家才能解出来,并且相当繁杂。后面零的概念提出来后,这些乘法小学生也可以做出来。

在程序语言世界中也有很多零的概念,事实上,很多人并没有感觉到它,所以可能在高层理解上就不够通透。

编 程语言本质上是处理离散点,所以是无穷可数集,所以本质上所有的操作可以看作是+,所有的函数都是+。而0在+中的作用相当重要。事实上,对应不同的可数 集,有不同的零,一个编程语言,其零是否是良定义的(什么是良定义,在下面会解释)十分重要,如果不是良定义的,那我们就要多加留心,以避免理解出错。

数字集:零为0;
字符串集:零为空串,形式表示为""
引用对象集:零为null关键字
数字集中的0是良定义的,必须满足:0+x=x;0+0=0;
字符串集的0是良定义的,必须满足:""+x=x;""+""=""
引用对象集的0是良定义的,必须满足:null+x=null;null+null=null
用函数的观点会更深刻:
f(0,x)=x;
f(0,0)=0;
f("",x)=x;
f(null,x)=null;
...
各种各样的0都在下面一一呈现:
首先,0+“”应该等于什么呢?用集合的观点,应该是:(0,"")+("",0)其实(0,"")=("",0)把这个定义为01,则有
0+“”=01;
0+null=02;
当然,语言设计的时候,我们可以精心定义0树,所以可能会有以下的结果:
0+""=01;
0+null=01
""+null=01;
另外还应有
0+01=0;
""+01="";
01+01=01;
null+01=null;

0+“ab"=0+""+"ab"=01+"ab"="ab";
null+"ab"=null+""+"ab"="ab"

他的具体函义是:如果一个函数的输入值其中一个为某一集合的0,另一输入另一集合的任意数,则输出应该是另一个集合的数。(这一点要细细理解,在0树上特别有用,什么是0树,以下的过程会展现)

是否这样定义要视程序语言而定,如果这样定义了,我们就是这样的程序语言是良定义的,是好用的。

不同的集合很多,如果再加上值对象,设其零为o;
则我们不防把所有程序语言涉及到的集合的并的零设为oo;
则 所有不同集合中的元素相加均为oo;oo与不同元素相加都等于该元素,oo+oo=oo;一般说来这个oo为关键字undefined;如果一个程序语言 没有这个oo,直接以出错来表示,则这样的程序语言就是没有0的程序,就是不良定义,如果用这样的语言来写,有些问题就会复杂化,正如我开头举的例子。
事实上,oo与不同元素相加都等于该元素 这一条很难满足,相信在未来可以,当下最普遍的情况下为oo与不同的元素相加等于oo。
undefined, 出错或其他异常双构成另一个集合,该集合有一个零,是真正的什么都没有,就是计算机什么也不反馈。由于什么也不反馈,所以就很难处理,这基本上是计算机的 终级0,当然,如果加上时间轴也可以细分,比如说t时间内什么也不反馈是一元素,那么t=无穷的时候就是终级0.
如果来到了终级0,是一个不好的事,最好的是在利用之前的零就顺利解决问题。

比如说语言与语言之间的元素相加又应该再加一个东西来表示他们相加后的“0”
比如说数据库中的类型money与C++语言中的string相加
应该定义一个东西表示他们相加以后的“0”;如果没有定义的话,就是不良的,当然这个不良不是程序语言的关系,而是整个语言环境。
=====================
C++是一个相当不良定义的语言
而java,c#要优秀一些
javascript,python似乎更进一层

==========
实例分析C#中的零:
数值:整数,浮点数,double有一个共同的零0(就是语言层面上解决互换问题,其实是内存的字节量的转换问题)
字符串:“”,注意,字符串本身是引用类型,“”表示这个引用类型存在,但是长度为0,是空串。
所有引用类型:null,如果一个引用类型变量为null,表示这个变量没有被一个指针引着,事实上,语言层面仍然用null这个存在的东西来表示,为什么这样做,见开头。

“”+0="0" 显然这是很糟糕的定义。
“”+null=""(合理)
null+null=null
null+34=null(显然很糟糕的定义)

但要指出来的是,单单一个+号的糟糕其实不影响大局,+是函数的抽象,关键是我们程序员定义的函数要符合以上所给的良定义,具体而言:
f("",0)=00
f("a",null)="a"
f(34,null)=34;

00是指引用类型与值类型的共同祖先Object的零,但是这个零并没有定义(语言层面,所以统一为null)
f("",0)=null

邮箱:dxfuni1@gmail.com

QQ群:5368572

(专注于算法,底层技术,网络搜索,数据库原理,操作系统)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值