写习惯C/C++系代码的人应该很习惯看见类似这样的代码:
1
2
3
4
5
|
int
i = 0;
......
if
(i){
//这里代码不会被执行
}
|
因此写习惯以后会想当然地觉得其他语言里应该0在if的条件里也表示false值. 除了少数非常强类型要求if后面必须为bool的语言(C#,F#.....) 其他那些允许把其他值放在 if 的条件里的语言,应该 0 都表示false, 非0都表示true.
但事实并非如此, 什么样的值表示true,什么样的值表示false,其实跟语言的设计理念和逻辑有关, 像C这类跟硬件贴近并且非常追求性能的语言里, 用int表示布尔值更多是性能(包括编译性能)的考虑, 而如果整数表示bool,则显然应该以 0 为 false这是没什么疑问的.而由C派生的一些语言,虽然抽象层次可能更高了,以至于这个以0为false的理由不存在了,但是由于兼容性的要求, 依然会选择以0值为false, 非0值为true, 比如python.
但是,其实另外有些语言则不是这样认为, 比如大量Lisp系语言, 很多认为 "只要有值就是true, 没有任何值才是false" 也就是说只有null / none / nil / empty / missing / undefined / unknown 语义才应该是false, 其他有确定值都应该是true. 因此0也不该例外,0是true, 比如对于clojure, 只有 空值(nil) 和 false本身是false,其他任何值都是true. 而对于scheme语言, 更加严格,甚至空表和空值都算做true, 在scheme语言中, 除了一个 #f 表示 false语义, 其他的"任何"东西,都是true语义, 包括空!
所以在scheme和clojure以及很多其他lisp方言里, (if 0 1 2) 的值都是1而不是2 . (这个if表达式类似C语言的 (0 ? 1 : 2) )
lisp抽象程度极高, 语义比性能更重要得多, 因此0值作为假并没有实质意义, 根据语言不同, 假的语义也许是 空 , 也许就真的仅仅是"假" , 对语义的理解和要求不同, 因此 0 自然也并不总是 false 了.