分页: 1 / 1

问个弱智问题

发表于 : 2010-05-20 23:08
chuihero
下面时linux编程基础中的一个shell程序的例子

代码: 全选

#!/bin/sh
yes_or_no() {
     echo “Is your name $* ?”
    while true
    do
        echo -n “Enter yes or no: “
        read x
        case “$x” in
            y | yes ) return 0;;
            n | no ) return 1;;
            * )  echo “Answer yes or no”
        esac
    done
}

echo “Original parameters are $*”

if yes_or_no “$1”
then
    echo “Hi $1, nice name”
else
    echo “Never mind”
fi
exit 0
输出如下:(./my_name是文件名)
$ ./my_name Rick Neil
Original parameters are Rick Neil
Is your name Rick ?
Enter yes or no: yes
Hi Rick, nice name
$


为什么函数yes_or_no 返回0时,if认为是真,返回1时,if认为是假呢?

Re: 问个弱智问题

发表于 : 2010-05-21 1:43
wowoto
...弱智问题还在这里问...

Re: 问个弱智问题

发表于 : 2010-05-21 21:24
chuihero
这里不是高手多吗,能给我直接的答复。

Re: 问个弱智问题

发表于 : 2010-05-21 21:31
ptpt52
chuihero, 你说得太对了,就是这样的,程序或者函数返回0表示其正常退出,为真,返回非0则认为是异常退出,为假。别先入为主,和你学的0为假1为真搞混了

Re: 问个弱智问题

发表于 : 2010-05-23 23:08
chuihero
Thanks,理解起来有点麻烦……

Re: 问个弱智问题

发表于 : 2010-06-03 6:13
aerofox
因为成功的情况一般来说只有一种,而出错的原因去可能各种各样,所以成功用 0 来表示,出错用非 0 来表示,这样可以用不同的非 0 值来表示不同的错误。

Re: 问个弱智问题

发表于 : 2010-06-03 14:13
poet
chuihero 写了: 为什么函数yes_or_no 返回0时,if认为是真,返回1时,if认为是假呢?
这是一个历史原因,很多人可能不清楚。

在多数 CPU 中,只有判断一个数是否为零的指令,没有判断是否为1的指令。

因此,判断一个数是否为零,只需要一条指令。

而判断一个数是否为1,需要两条指令,先把它减1,然后判断它是否为零。

所以说,在效率至上的年代,认为判断是否为零具有最高的效率,应当让程序在“正常情况下”都具有最高的效率。因此,那个年代就制定出了如果成功或者一切正常,应该返回零的规定。


严格的说来,在当今的 CPU 性能和体系下,这点性能差异其实是可以忽略不计的,一些新的语言应当提倡使用 1 来表示成功。但是由于 Unix 本身诞生的历史非常悠久,一些已经决定的事实是不容易改变的。

Linus 曾在 Linux 编程规范中详细的说明了对 0 的使用,但是他的这个规范也并非每人都去遵守,否则楼主那样的程序就不会出现了。至少根据他的那个规定,yes应当为 1,no 应当为 0。

Re: 问个弱智问题

发表于 : 2010-06-03 14:41
tenzu
poet 写了:
chuihero 写了: 为什么函数yes_or_no 返回0时,if认为是真,返回1时,if认为是假呢?
这是一个历史原因,很多人可能不清楚。

在多数 CPU 中,只有判断一个数是否为零的指令,没有判断是否为1的指令。

因此,判断一个数是否为零,只需要一条指令。

而判断一个数是否为1,需要两条指令,先把它减1,然后判断它是否为零。

所以说,在效率至上的年代,认为判断是否为零具有最高的效率,应当让程序在“正常情况下”都具有最高的效率。因此,那个年代就制定出了如果成功或者一切正常,应该返回零的规定。


严格的说来,在当今的 CPU 性能和体系下,这点性能差异其实是可以忽略不计的,一些新的语言应当提倡使用 1 来表示成功。但是由于 Unix 本身诞生的历史非常悠久,一些已经决定的事实是不会改变的。
学习了 :em11

Re: 问个弱智问题

发表于 : 2010-06-03 17:54
xieshaohu
已经习惯了0表示成功,0以外表示失败了。

从设计的角度来看,如果用0表示成功,可以用不同的非零值表示不同的错误类型,个人感觉这个还是挺好理解的。

Re: 问个弱智问题

发表于 : 2010-12-16 13:26
禁飞区
受教了.

Re: 问个弱智问题

发表于 : 2010-12-17 13:59
linxiaoyu
if 判断表达式或是命令时, 一个规定就是0 就执行,非零pass
跟C语言明显不一样,楼主别弄混了。

Re: 问个弱智问题

发表于 : 2010-12-17 19:34
liu滔
虽然C语言里的if语句会将1视为真而将1以外的数(所以也就包括0……)视为假,但其实我一般如果写函数的返回值来表示函数的执行是否是预期的情况的话,还是用0来表示成功,而用0以外的数(包括1……)来表示失败的…… :em09

Re: 问个弱智问题

发表于 : 2010-12-17 20:02
退避九舍
liu滔 写了:虽然C语言里的if语句会将1视为真而将1以外的数(所以也就包括0……)视为假,但其实我一般如果写函数的返回值来表示函数的执行是否是预期的情况的话,还是用0来表示成功,而用0以外的数(包括1……)来表示失败的…… :em09
貌似在C语言中,0为假,非0即为真。