2012年3月6日星期二
初学配置安装Linux撞鬼集2
什么?0 == true?
习惯了各种C系编程,很自然的认为0表示false,1(或者其它非零非空值)表示true。于是当你看到一个脚本如下所示:
#!/bin/sh
function ret0 { return 0; }
if ret0; then
echo "HELLO! The condition is TRUE!"
else
echo "HELLO! The condition is FALSE!"
fi
这时候,如果你继续使用C系列语言(乃至绝大多数常见语言比如js)的思维来思考的话,你会认为输出应该是
HELLO! The condition is FALSE!
可是当你运行这段脚本之后,你会发现结果居然是TRUE……当然了,自圆其说还是可以的:C/ASM的标准中,返回0表示没错,其它值表示有问题。既然经常要判断是否正常,用0表示true也是可以理解的。这个让我想起了在飞机上和印度人聊天,当他点头的时候我都不知道到底算是Yes呢还是No,我看他自己也搞不清楚,经常是先点头后摇头,或者先摇头后点头。
总结:
Linux/Unix的Bash尽管是用C写的,那也不代表其脚本语言就遵循了这些语言的逻辑标准。
P.S.:
Q:为什么成功通常是0呢?
A:因为出错的原因多种多样啊,比如1表示文件不存在,2表示目录不存在,3表示你太罗嗦了……
Q:可是,这还是不能解释为什么选择了0这个值,而不是其它值,比如1来表示成功啊。
A:因为你必须写某个判断语句来判断之前的操作/调用是否成功,比如说:
if (ret == 0) printf ("success");
0这个数字比其它的数字都好记,但这还不是最重要的。最重要的是,判断是否为零,在汇编当中比判断任何其它数字都要简单和快速(相对于机器而言),至少在x86系列肯定是这样的。比如:
; if ax == 0 goto label
xor ax, ax ; 当然了,这里的ax就毁了。但通常后边不会再用,要用就先备份好了。
jz label
; if ax == 1 goto label
cmp ax, 1
jz label
前者最短只有2个字节,后者最短要5个字节。早期的CPU中(比如386),时间周期也会有非常巨大的差别。前者第一句话可能1个时钟周期就完事了,后者可能得要4个时钟周期。啥?看不懂?复习汇编去。
(待续)
订阅:
博文评论 (Atom)
没有评论:
发表评论