"0" 并不一定是 假 (false)

写习惯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 了.

转载于:https://www.cnblogs.com/syeerzy/p/4612527.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值