写习惯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. DotNet 学习笔记 MVC模型

    Model Binding Below is a list of model binding attributes: •[BindRequired]: This attribute adds a mo ...

  2. linux C 中的volatile使用【转】

    转自:http://blog.csdn.net/sukhoi27smk/article/details/38020583 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器 ...

  3. python基础===python3 get和post请求(转载)

    get请求 #encoding:UTF-8 importurllib importurllib.request data={} data['name']='aaa' url_parame=urllib ...

  4. python基础===python3中 http.client 和 urllib的那些事

    import http.client #python3中没有了 httplib的库 #python 3.x中urllib库和urilib2库合并成了urllib库.. #其中urllib2.urlop ...

  5. Perl的Expect模块学习

    Perl的Expect模块学习 http://www.xuebuyuan.com/1852717.html

  6. selenium 找不到元素 (显式等待 和隐式等待的区别)

    selenium自动化页面元素不存在异常发生的原因有一下几点: (1)页面加载时间过慢,需要查找的元素程序已经完成但是页面还未加载成功.此时可以加载页面等待时间. (2)查到的元素没有在当前的ifra ...

  7. Selenium2+python自动化55-unittest之装饰器(@classmethod)【转载】

    前言 前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间. 于是就想是不是可以 ...

  8. 安装XHProf分析PHP性能瓶颈(原创)

    废话不多说,直接上代码 ,手动滑稽.o(╯□╰)o   如果已解决您的问题,请在文章底部点击下关注,非常感谢. 下面是LINUX命令行 $ wget http://pecl.php.net/get/x ...

  9. Asp.net中的一个判断session是否合法的做法

    1 if (Session["UserID"] == "" || Session["UserID"] == null) 2 { 3     ...

  10. HDU 6315.Naive Operations-线段树(两棵树合并)(区间单点更新、区间最值、区间求和)+思维 (2018 Multi-University Training Contest 2 1007)

    6315.Naive Operations 题意很好理解,但是因为区间求和求的是向下取整的a[i]/b[i],所以直接分数更新区间是不对的,所以反过来直接当a[i]==b[i]的时候,线段树对应的位置 ...