TRUE是否始终具有非零值?
我有一个同事,曾经将TRUE定义为0,所有其他值均为FALSE。我可以保证我曾经使用过的每种语言,如果我们甚至可以获得布尔值,那么FALSE的值为0。TRUE曾经是0吗?如果是这样,我们什么时候切换?
解决方案
如果没有其他要求,bash shell仍将0表示为true,将1表示为false。
它可能是在结果代码为0的情况下引用的,在大多数情况下,该代码在进程运行后才显示,结果代码为0表示:"嘿,一切正常,这里没有问题。"
用我曾经使用过的任何语言(在70年代末回溯至BASIC),false都被认为是0,而true则是非零。
我不确定,但是我可以告诉你:依赖TRUE和FALSE的内在本质的技巧很容易出错,因为这些值的定义取决于语言的实现者(或者至少是说明符)。
我记不清" TRUE"是" 0"。
不过,C程序员会返回" 0"来表示成功。这可以与" TRUE"混淆。
也不总是1. 它可以是-1或者非零。
对于没有内置布尔类型的语言,我所看到的唯一约定是将TRUE定义为1,将FALSE定义为0。例如,在C语言中,如果条件表达式的值等于任何值,则if语句将执行if子句除0以外。
我什至曾经看过一个编码指南文档,该文档专门说不要重新定义TRUE和FALSE。 :)
如果我们使用的是内置布尔值的语言(例如C ++),那么关键字" true"和" false"是该语言的一部分,因此我们不应依赖于它们的实际实现方式。
即使在今天,在某些语言(Ruby,lisp等)中,0都是正确的,因为除nil之外的所有内容都是真实的。 1通常是正确的。这是常见的陷阱,因此有时不认为0为假,而是进行显式测试是一种很好的做法。 Java要求我们执行此操作。
代替这个
int x; .... x = 0; if (x) // might be ambiguous { }
制作是明确的
if (0 != x) { }
同事感到困惑的0 /非0可能是指人们使用数值作为返回值来表示成功而不是事实(即在bash脚本和某些C / C ++样式中)
使用0 =成功可以更精确地指定失败原因(例如1 =缺少文件,2 =缺少肢体等)。
附带说明:在Ruby中,唯一的false值是nil和false。 0是正确的,但与其他数字相反。 0是正确的,因为它是对象0的一个实例。
我记得在True为-1的访问形式下进行了一些VB编程。
在像C这样的语言中,没有布尔值,因此我们必须定义自己的值。他们可以使用非标准的BOOL替代吗?
C标准库中的系统调用通常在错误时返回-1,在成功时返回0。同样,Fotran计算的if语句将(并且可能仍然)跳至三个行号之一,具体取决于评估为小于,等于或者大于零的条件。
例如:IF(I-15)10、20、10
将测试I == 15的条件(如果为true,则跳至第20行(评估为零)),否则,跳至第10行。
Sam关于依靠实现细节的特定知识的问题是正确的。
我记得PL / 1没有布尔类。我们可以创建一个位并将其分配为布尔表达式的结果。然后,要使用它,我们必须记住1是错误的,0是正确的。
C标准库中的几个函数返回"错误代码"整数作为结果。由于noErr定义为0,因此快速检查可以为"如果为0,就可以"。 Unix进程的"结果代码"采用了相同的约定。也就是一个整数,用于指示给定过程的完成方式。
在Unix Shell脚本中,刚刚执行的命令的结果代码可用,通常用于表示命令是否"成功",0表示成功,以及其他特定的不成功条件。
因此,shell脚本中所有类似于测试的构造都使用"成功"(即结果代码为0)表示TRUE,其他表示FALSE。
在完全不同的平面上,数字电路经常使用"负逻辑"。也就是说,即使将0伏称为"二进制0",并将某个正值(通常为+ 5v或者+ 3.3v,但如今使用+ 1.8v并不罕见)称为"二进制1",但某些事件被"认定"通过将给定的引脚设置为0,我认为有一些抗噪声的优点,但是我不确定原因。
注意,但是,这没有什么"古老"或者"转换时间"。我所知道的一切都是基于旧的约定,但今天完全是最新的和相关的。
DOS和应用程序的退出代码通常使用0表示成功,使用非零表示某种类型的失败!
DOS错误代码为0-255,使用'errorlevel'语法进行测试时,表示高于或者包含指定值的所有内容,因此以下内容将第一个转到的匹配项设置为2和以上,将第二个匹配为1并匹配最后一个为0(成功)。 !
IF errorlevel 2 goto CRS IF errorlevel 1 goto DLR IF errorlevel 0 goto STR
当bash的true / false return语句处于相反状态时,很容易感到困惑:
$ false; echo $? 1 $ true; echo $? 0
在大多数情况下,将false定义为0,将true定义为非零。有些编程语言使用1,有些使用-1,有些使用任何非零值。
但是,对于Unix shell,它们使用相反的约定。
实际上,在Unix Shell中运行的大多数命令都是小程序。它们传回退出代码,以便我们可以确定命令是否成功(值为0),还是由于某种原因而失败(1或者更多,取决于失败的类型)。
在if / while / until命令中的sh / ksh / bash shell解释器中使用它来检查条件:
if command then # successful fi
如果命令成功(即返回零退出代码),则执行语句中的代码。通常,使用的命令是[命令,这是测试命令的别名。
一般规则:
- 外壳程序(包括DOS)将" 0"用作"无错误" ...不一定正确。
- 编程语言使用非零来表示真实。
就是说,如果我们使用的语言可以定义FALSE的TRUE,请对其进行定义并始终使用常量。
有趣的是,这取决于我们使用的语言。在Lua中为true ==内部零表示性能。对于C中的许多系统调用,该效果相同。
在C语言中,在C ++之前,没有布尔值。条件条件是通过测试int来完成的。零表示假,任何非零表示真。所以你可以写
if (2) { alwaysDoThis(); } else { neverDothis(); }
幸运的是,C ++允许使用专用的布尔类型。
我听说过并使用了较旧的编译器,其中true> 0,false <= 0。
这是我们不想使用if(pointer)或者if(number)来检查零的原因之一,它们可能会意外地得出false。
同样,我在NULL不为零的系统上工作。
我曾在一家拥有大量旧C代码的公司工作。一些共享头为TRUE和FALSE定义了它们自己的值,而某些共享头确实将TRUE设置为0,将FALSE设置为1. 这导致了"真相大战":
/* like my constants better */ #undef TRUE #define TRUE 1 #undef FALSE #define FALSE 0