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)时便为假。