Language agnostic 三态值——有约定吗?

Language agnostic 三态值——有约定吗?,language-agnostic,tri-state-logic,Language Agnostic,Tri State Logic,我有点装腔作势,我不知道答案是什么 基本上-在三态数据类型中使用什么值有约定吗?通过谷歌搜索,它看起来不像是:我看到: -1=假,0=未知/未定义,+1=真 0=假,+1=真,+2=未知/未定义 -1=未知/未定义,0=假,+1=真 …等等。如果有的话,我宁愿使用一个著名的惯例。否则我会编一个:-)很可能没有正确的答案,但我想我应该再深入一点 编辑 在最近的代码中也找到了这个:-1=真,0=假,2=未知。我假设2==unknown意味着当只查看调试器/转储/内存等中的原始值时,它消除了解释+

我有点装腔作势,我不知道答案是什么

基本上-在三态数据类型中使用什么值有约定吗?通过谷歌搜索,它看起来不像是:我看到:

  • -1=假,0=未知/未定义,+1=真
  • 0=假,+1=真,+2=未知/未定义
  • -1=未知/未定义,0=假,+1=真
…等等。如果有的话,我宁愿使用一个著名的惯例。否则我会编一个:-)很可能没有正确的答案,但我想我应该再深入一点

编辑

在最近的代码中也找到了这个:-1=真,0=假,2=未知。我假设2==unknown意味着当只查看调试器/转储/内存等中的原始值时,它消除了解释+1/-1的模糊性。奇怪的是,这个选项仅出于这个原因(消除了忘记1的哪个变量表示“true”的机会)。

我想说没有什么像约定一样,但是我更喜欢你提到的第三种情况,因为我已经见过很多次了

Value       State
----------  ----------
 -1         Undefined
  0         False
 +1         True

我不喜欢前两种情况,因为纯布尔状态大多被确定为
0=False
0 True
,因此可能会有点混淆。

据我所知,这方面没有约定

布尔值甚至没有一个约定,最常见的是:

  • 0=假,-1=真
  • 0=假,1=真
另一个相关的常见(但不是通用)约定是对未定义的值使用-1

如果选择使用-1表示未定义,则可以使用0/1表示False/True:

  • -1=未定义
  • 0=错误
  • 1=正确

当然,我必须提到,第三种状态当然不应该是未定义的/未知的,但是

不管你附加了什么语义,我都会选择你的三个值:一个负数、一个正数和零。这允许对3个可能值的每个可能1或2元素子集的成员资格进行优化测试,只需一个测试和分支(>0,=0,如果你想用int来代替三态bool,你可以不用担心标准。比如,在C#
bool?triState
中。它可以有值true、false或null,这些值可以被认为是未知的-但我发现这不是你想要的

我不知道什么是传统。从这里给出的答案来看肯定不是。我喜欢你的第三个

但从另一个角度来看,我会选择:

{ True, Unknown, False } => 0, 1, 2 // going by enum like values...

编辑:在@LarsTech的一个好观点之后,我应该澄清一下。如果我知道一个变量可以有两个以上的值,那么我会认为它是一个枚举,因此我可以将它转换为{0,1,2}。我总是遵循这样的枚举值模式:“好的,好的,差的”。这对我来说很自然,但对很多人来说,它是一个“0”不受欢迎。一个人总是可以有一个相反的顺序。

中间的一个看起来相互关联;一个三态,其中两个状态相同……;)@Guffa-不适合我。我经常使用Windows API,在大多数情况下,他们使用0作为假状态。这就是为什么我喜欢第三种情况,其中0=假。@daemon_x:我认为你没有彻底阅读我的评论…@Guffa--复制和粘贴失败。修复,ta:-)我一直想要一个三态bool。厌倦了为我多次遇到的东西创建枚举。想知道是否有语言默认提供了三态。第三个是很酷的,尽管在这里..Unix shell也使用0=True,其他任何东西都使用False。这就是编写
返回0的部分原因在C中;因为返回值为0意味着一切正常,而其他任何东西则意味着某些东西不好。我习惯于布尔值不太通用,但0为false通常是通用的。因此,通常可以安全地假设非零为真(无论实现如何)。贝壳是一条红鲱鱼,它们不是粘性布尔型的;返回值是错误代码,0通常表示“无错误”,任何其他值都表示错误的实际情况。+1对于经典的^H^H^H^H^H^H CLBUTIC daily WTF(我将在评论中提到它),您的“选择”将变为True=0,世界上其他国家认为应该是错误的。@LarsTech Accepted True=0不是常规的,但它仍然在Ruby和Lua等语言以及bash脚本中占有一席之地。这个帖子上被接受的答案也说明了这一点。我不需要提及C解释器如何在内部表示成功(尽管没有显式地转换为true)。类似的事情,我记得在大学里学习过数字信号编码技术,其中0表示高电压。@LarsTech但说到我的观点,如果是真与假,并分别将它们赋值为0和1,我也会感到困惑。但这里的OP是一个三州大会,若我能从枚举的角度思考的话,我对我的选择感到满意。enum在处理2个以上的状态需求方面做得最好&我想说,人们应该像处理enum一样思考&因此“0,1,2”是一个不错的选择。也许只有我喜欢Enum中的约定,比如:非常好,很好,很好,不好,陷阱。我通常喜欢这个。既然没有一个惯例,那就是我的想法。