我有一个同事认为TRUE过去被定义为0而其他所有值都是FALSE。我可以发誓我使用的每种语言,如果你甚至可以得到一个布尔值,那么FALSE的值是0.去过TRUE是0吗?如果是的话,我们何时切换?

有帮助吗?

解决方案

你的同事感到困惑的0 /非0可能是指人们使用数值作为表示成功的返回值,而不是真值(即在bash脚本和某些样式的C / C ++中)。

使用0 =成功可以更精确地指定失败原因(例如1 =丢失文件,2 =丢失肢体等)。

作为旁注:在Ruby中,唯一的错误值是nil和false。 0为真,但与其他数字不同。 0为真,因为它是对象0的实例。

其他提示

它可能引用了结果代码0,在大多数情况下,在进程运行之后,结果代码为0意味着,<!>“嘿,一切正常,没有问题。<!> quot ;

我在一家拥有大量旧C代码的公司工作。一些共享头文件为TRUE和FALSE定义了自己的值,有些确实将TRUE设置为0,将FALSE设置为1.这导致<!>“真实战争<!>”;

/* like my constants better */
#undef TRUE
#define TRUE 1

#undef FALSE
#define FALSE 0

如果没有别的,bash shell仍然使用0表示true,将1表示为false。

C标准库中的几个函数返回“错误代码”整数作为结果。由于noErr被定义为0,因此快速检查可以是'如果它是0,那就好'。同样的惯例传递给Unix进程''结果代码';也就是说,这个整数给出了关于给定过程如何完成的一些消息。

在Unix shell脚本中,刚刚执行的命令的结果代码是可用的,并且用于表示命令是否“成功”,0表示成功,以及其他任何特定的非成功条件。

由此,shell脚本中的所有类似测试的构造都使用“success”(即结果代码为0)表示TRUE,其他任何表示为FALSE。

在完全不同的平面上,数字电路会频繁使用“负逻辑”。也就是说,即使0伏被称为'二进制0'和一些正值(通常+ 5v或+ 3.3v,但现在使用+ 1.8v并不罕见)被称为'二进制1',一些事件被'断言'一个给定的引脚变为0.我认为有一些抗噪声优势,但我不确定原因。

但请注意,没有什么'古老'或某些'切换时间'。我所知道的一切都是基于旧的惯例,但今天是完全现实和相关的。

我不确定,但我可以告诉你:依赖于TRUE和FALSE的潜在性质的技巧容易出错,因为这些值的定义由语言的实现者决定(或者,至少,说明者)。

C标准库中的系统调用通常在出错时返回-1,在成功时返回0。此外,Fotran计算if语句将(并且可能仍然)根据评估为小于,等于或大于零的条件跳转到三个行号中的一个。

例如:IF(I-15)10,20,10

将测试I == 15的条件,如果为真,则跳转到第20行(评估为零),否则为第10行。

Sam对于依赖于具体实施细节知识的问题是正确的。

一般规则:

  1. 壳(包括DOS)使用<!>“0 <!>”; as <!> quot; No 错误<!>“; ...不一定是真的。

  2. 编程语言使用非零 表示真实。

  3. 也就是说,如果您使用的语言定义为TRUE为FALSE,请定义它并始终使用常量。

即使在今天,在某些语言中(Ruby,lisp,...)0也是如此,因为除了nil之外的所有内容都是正确的。更常见的是1。这是一个常见的问题因此,有时候我认为不要依赖0是假的,而是做一个明确的测试。 Java要求你这样做。

而不是这个

int x;    
....
x = 0;
if (x)  // might be ambiguous
{
}

制作是明确的

if (0 != x)
{
}

我记得在访问表单中做了一些VB编程,其中True是-1。

我记得PL / 1没有布尔类。您可以创建一个位并为其分配布尔表达式的结果。然后,要使用它,你必须记住1是假的,0是真的。

在大多数情况下,false定义为0,true为非零。有些编程语言使用1,有些使用-1,有些则使用任何非零值。

对于Unix shell,它们使用相反的约定。

在Unix shell中运行的大多数命令实际上都是小程序。它们会传回一个退出代码,以便您可以确定命令是否成功(值为0),或者是否由于某种原因(1或更多,取决于失败的类型)失败。

在if / while / until命令中的sh / ksh / bash shell解释器中使用它来检查条件:

if command
then
   # successful
fi

如果命令成功(即返回零退出代码),则执行语句中的代码。通常,使用的命令是[command,它是测试命令的别名。

有趣的是,这取决于你正在使用的语言。在 Lua 为真==内部为零性能。对于C中的许多系统调用都是如此。

当bash的true / false返回语句是另一种方式时,很容易混淆:

$ false; echo $?
1
$ true; echo $?
0

我听说并使用了较旧的编译器,其中是真正的<!> gt; 0,false <!> lt; = 0.

这是你不想使用if(指针)或if(number)来检查零的一个原因,它们可能会意外地评估为false。

同样,我曾在NULL不为零的系统上工作过。

在C语言中,在C ++之前,没有布尔值这样的东西。通过测试int来完成条件。零意味着虚假,任何非零意味着真实。所以你可以写

if (2) {
  alwaysDoThis();
} else {
  neverDothis();
}

幸运的是,C ++允许使用专用的布尔类型。

在我曾经使用的任何语言中(在70年代后期回到BASIC),false被认为是0而且true是非零。

我不记得TRUE正在0。 但是,1是C程序员返回以表示成功的东西。这可能与-1混淆。

它也不总是<=>。它可以是<=>或只是非零。

对于没有内置布尔类型的语言,我见过的唯一约定是将TRUE定义为1,将FALSE定义为0.例如,在C中,如果条件表达式,if语句将执行if子句评估为0以外的任何其他内容。

我甚至曾经看过一份编码指南文件,该文件明确表示不会重新定义TRUE和FALSE。 :)

如果您使用的是具有内置布尔值的语言(如C ++),则关键字truefalse是该语言的一部分,您不应该依赖它们的实际实现方式。

在像C这样的语言中没有布尔值,所以你必须定义自己的。他们可以使用非标准的BOOL覆盖吗?

来自应用程序的DOS和退出代码通常使用0表示成功,非零表示某些类型的故障!

DOS错误代码为0-255,当使用'errorlevel'语法进行测试时,意味着任何高于或包含指定值的内容,因此以下内容与第一个goto,1到第二个和0(成功)匹配2和以上最后一个!

IF errorlevel 2 goto CRS
IF errorlevel 1 goto DLR
IF errorlevel 0 goto STR

SQL Server数据库引擎优化了位列的存储。如果表中有8位或更少位列,则列存储为1个字节。如果有9到16位列,则列存储为2个字节,依此类推。 字符串值TRUE和FALSE可以转换为位值:TRUE转换为1,FALSE转换为0。 转换为位会将任何非零值提升为1.

每种语言的真假都可以为0 所以停止使用数字使用单词true 大声笑 或者t和f 1字节存储

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top