1.1 在比较中学习
假设你正在学习一种编程语言 X,并为区分知识要点和非要点而苦恼。这时,如果你开始学习另一种编程语言 Y,这个问题可能就会迎刃而解。因为你开始了解那些因语言不同导致的差异,什么规则是 X 和 Y 共通的,什么又是 X 语言独有的。
多种语言共通的知识才是要点。掌握了这些要点,学习其他语言时才会更加轻松。
语言不同,规则不同
在比较中学习多种语言时,一些知识能理解得更深刻。所谓语言不同,规则不同。
编程语言的教材中会罗列出各种各样的规则。其实这些规则并不具有普遍意义,只是因为“在当前的特定情况下,做此规定能更方便”1。
1“这样写更自然,那就规定这样写吧。规定这东西唾手可得。”这句名言出现在竹内郁雄所著的《初めての人のための LISP[ 増補改訂版 ]》(翔泳社,2010 年出版。中文译名:LISP 基础教程)一书中。
某种语言的教材里出现的某某规则不过是该语言里的规则,仅此而已。
C 语言和 Ruby 语言中的真假值
我们来看一下决定孰真孰假的真假值。学过 C 语言的人都被告知 0 是假、其余为真。于是仅仅学过 C 语言的人就容易误解为在程序设计中 一般 0 就代表假、其余为真。因此,等到开始学习 Ruby 语言,发现在 Ruby 中 0 是真时,不免十分惊讶。
C语言中0是假,所以显示为"false!"
#include <stdio.h>
int main(){
if(0){
printf("true!\n");
}else{
printf("false!\n");
}
}
Ruby语言中0是真,所以显示为"true!"
if 0 then
print "true!"
else
print "false!"
end
我们可以借助这次恍然大悟的机会,来修正由来已久的错误想法。即,并不是一般情况下 0 都为假、其余为真,在 C 语言中,0 为假其余为真,而在 Ruby 中,false 和 nil 为假其余(包括 0 在内)都为真。
那其他语言又是什么情况,大家有兴趣了解吗?笔者是颇有兴趣的。这时,笔者有了一个明确的目的,想知道其他语言中真假是如何定义的。目的明确了,学习效率自然而然就提高了。
Java 语言中的真假值
笔者比较过各种语言,这里只列举其一。Java 语言是有真假值这一数据类型的,在条件语句中必须使用这种类型。因为 0 为整型而不是真假值类型,如果在条件语句中用 0 作判断条件,就要发生编译错误。可见,0 为真、0 为假、0 既非真亦非假的语言都是存在的。2
2再来看一下非数值的情况。Python 语言中 0 为假,大小为 0 的容器也定义为假,所以空字符串与空的列表也为假。C 语言中用于处理字符串的 char* 即使指向的字符串为空也不为假,而当不指向任何值(值为 NULL)时便为假。
