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

"0" 并不一定是 假 (false)的更多相关文章

  1. 判断 0 和 '' 以及 empty null false的关系

    if('safdasefasefasf'==0) { echo "该字符串转换为数字 等于 0 <br/>"; } //output:该字符串转换为数字 等于零. 这是 ...

  2. PHP empty函数判断0返回真还是假?

    最近项目中,遇到一个字段是 “是否启用”值为0,1 在查询时没想就写了 if ( isset($args_array['useFlg']) && !empty($args_array[ ...

  3. js中‘0’到底是 true 还是 false

    if ('0') alert("'0' is true");  if ('0' == false) alert("'0' is false");结果是,两次都 ...

  4. JS规则 较量较量(比较操作符) 两个操作数通过比较操作符进行比较,得到值为真(true)和假(false)。【>; <; >=; <=; !=;==】

    较量较量(比较操作符) 我们先来做道数学题,数学考试成绩中,小明考了90分,小红考了95分,问谁考的分数高? 答: 因为"95 > 90",所以小红考试成绩高. 其中大于号& ...

  5. js中 null, undefined, 0,空字符串,false,不全等比较

    null == undefined // true null == ''  // false null == 0 // false null == false // false undefined = ...

  6. python全栈开发-Day13 内置函数

    一.内置函数 注意:内置函数id()可以返回一个对象的身份,返回值为整数. 这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以 ...

  7. Python开发 基礎知識 3.類別&方法 (bool & str) (未完待續)

    類別 可使用type()查看 內建 [ 布爾:bool (Boolen) 字串:str (String) 數字:int (Integer) 小數:float 列表:list 元祖:tuple 字典:d ...

  8. 函数和常用模块【day04】:内置函数(八)

    一.常用内置函数 1.表格 二.内置函数详情(1-10) 1.abs(x) 功能:取数的绝对值 1 2 >>> abs(-1)  #取-1的绝对值 1 2.all(iterable) ...

  9. Shell编程-05-Shell中条件测试与比较

    目录 Shell脚本条件测试 Shell文件测试 Shell字符测试 Shell整数测试 Shell逻辑测试 Shell条件测试总结 Shell脚本条件测试     在Shell脚本中各种条件结构和流 ...

随机推荐

  1. 【洛谷 SP2878】Knights of the Round Table(双联通分量)

    先放这吧,没时间写,明天再补 "明天到了" 题目链接 题意:求不在任何奇环内的点的数量. Tarjan求点双联通分量,然后再染色判断是不是二分图就好了. 只是不懂为什么Tarjan ...

  2. bzoj 1951 lucas crt 费马小定理

    首先假设输入的是n,m 我们就是要求m^(Σ(c(n,i) i|n)) mod p 那么根据费马小定理,上式等于 m^(Σ(c(n,i) i|n) mod  (p-1)) mod p 那么问题的关键就 ...

  3. 【Python实例二】之前期准备:Windows下的BeautifulSoup安装

    前言 一直久闻Python的爬虫很高效,而且操作便捷,因此决定开始练习爬虫的相关内容. 首先尝试的是Python的爬虫利器之一:BeautifulSoup.(这名字听起来就有种想要去探究的兴趣.... ...

  4. 会话Cookie

    Cookie分为会话Cookie和本地Cookie两种 之前一直理解的是会话Cookie不在本地文件存储,只存储于内存,而本地Cookie因为设置了expire过期时间需要在本地存储 下面是白帽子讲W ...

  5. POJ1258 (最小生成树prim)

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 46319   Accepted: 19052 Descri ...

  6. Codeforces 219D Choosing Capital for Treeland 2次DP

    //选择一个根使得变换最少边的方向使得能够到达所有点#include <map> #include <set> #include <list> #include & ...

  7. mysql常用函数示例

    CREATE TABLE `orders` ( `OrderId` INT(10) NOT NULL AUTO_INCREMENT COMMENT '编号', `ProductName` VARCHA ...

  8. hdu 1669(二分图多重匹配)

    Jamie's Contact Groups Time Limit: 15000/7000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/ ...

  9. hdu 5190(水题)

    Go to movies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  10. hdu 5174(计数)

    Ferries Wheel Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...