编程语言中的假大空
假大空一直是人们深恶痛绝的,在编程语言中同样如此,因为它们制造了许多的陷阱。但没有它们还不行,没有它们,编程语言甚至跑不起来。
学习一门编程语言,首先要了解这门语言是如何表示假大空的。
假
在c语言中,只有一种东西是假,那就是数字0,其它都为真。真假配合if语句或者条件表达式来使用。
在现在很多编程语言中,使用boolean类型中的false值来表示假。scheme中,用#f表示假。
假是一种逻辑值,帮助人们完成程序的分支,跳转,中断等;假与真构成一对矛盾,而矛盾是推动事物发展的内在因素。所以,不能没有。
lisp和lua中,用nil表示假。
多数语言的 if语句可以判断的内容类型是很广泛的,但假值被限定在小的范围。
大
大最擅长的事是制造溢出,越界访问等错误。在c语言中,数字大小是有范围的,因为字节长度有限。对一个有符号的正整数来说,一直变大最后会溢出,溢出了就变成了负数。程序员只能自己小心翼翼的编码,防止溢出。
数组的长度也是有限的,当使用的下标超出数组范围的时候,就会发生必然会发生的错误。
每种编程语言对大的定义是不一样的。大到什么程度才算大。超出预先的约定,都是大。绝对值极大的负数也是一种大。绝对值无限接近于0的数也是大,因为要表示它,需要极大的负数幂,那个幂本身就可能超出机器能表示的范围。所以,小到极致还是大。
计算机只能处理小,而越来越进步的计算机就越来越能处理大。但能处理的都是小,不能处理的都是大。
c语言用外部的数学库来完成大的计算。多数的LISP语言天生就能处理大整数,几百位或者几千位十进制,乃至更多。但再大也有范围。
有的编程语言不能处理大,就用NaN来表示大。多数的时候,你看到这三个字母,就表示程序出错了。这三个字母的意思是Not A Number。大被表示成不是一个数字。
空
空表示没有,通常是指集合中没有元素,或者是列表队列栈中没有元素。而表示空,也常常用数字0,表示集合中有零个元素,或者数据长度为零。
c语言表示空的实现多种多样,常用的做法是判断一对指针的相对位置。
空表示没有,但空本身需要一种表示。LISP语言中用一对没有任何内容的括号表示空。nil是空列表,也是假逻辑值,是既假且空的。null用来判断一个列表是否为空列表。
空表示没有,但可以有。表示空的变量通常可以进行元素的添加,但能添加多少,就受到大的限制。大带来麻烦,但空不会。只要注意集合空了以后,就不要再删除元素了。不要删除集合中不存在的元素(这个涉及到无的范畴)。空不是无,但空可以表示无,无也可以表示空。无元素的集合是空集。集合中不存在的,就是无。
这里面会有一个深层次的哲学上逻辑悖论。但设计好元素的类型,多数时候不会引发程序错误。这就是类型检查为什么如此重要的缘故。
编程语言中,空的函数或者操作也很重要。
汇编语言用NOP表示空操作,什么也不做。但将来改写以后也可以做点什么。还可以用来对齐数据。
在面向对象的语言中,空的函数很重要,常用来继承。空是一种抽象,表示现在是无,将来可以有。或者,本来有,但现在没有。所以,空不是无。
如果有一个ID函数,返回参数本身,那么它看起来像空函数。但它不是空,因为它已经有了操作。真的空函数什么也不做。但编译器还是对它做了点什么,因此空就变的有用了。
在perl语言中,空的字符串也可以表示逻辑的假。
除了假大空,最重要的概念就是无