“内容能够理解,但总觉得不够透彻。” 大家在学习编程的过程中有过这种感觉吗? 当新学的知识与自身经验以及原来掌握的知识尚未很好结合的时候,往往会出现这种似懂非懂的状态。 “要学的东西太多了,先学什么好呢?” 大家曾为这种问题苦恼过吗? 我们都想集中精力学习一些知识要点,但是怎样才能做到呢? 1.1 在比较中学习 假设你正在学习一种编程语言X,并为区分知识要点和非要点而苦恼。这时,如果你开始学习另一种编程语言Y,这个问题可能就会迎刃而解。因为你开始了解那些因语言不同导致的差异,什么规则是X和Y共通的,什么又是X语言独有的。 多种语言共通的知识才是要点。掌握了这些要点,学习其他语言时才会更加轻松。 语言不同,规则不同 在比较中学习多种语言时,一些知识能理解得更深刻。所谓语言不同,规则不同。 编程语言的教材中会罗列出各种各样的规则。其实这些规则并不具有普遍意义,只是因为“在当前的特定情况下,做此规定能更方便”A。 A “这样写更自然,那就规定这样写吧。规定这东西唾手可得。”这句名言出现在竹内郁雄所著的《初めての人のための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既非真亦非假的语言都是存在的。A A 再来看一下非数值的情况。Python语言中0为假,大小为0的容器也定义为假,所以空字符串与空的列表也为假。C语言中用于处理字符串的Char*即使指向的字符串为空也不为假,而当不指向任何值(值为NULL)时便为假。