三态价值 - 是否有约定?

时间:2011-06-07 11:06:24

标签: language-agnostic tri-state-logic

我被抛出一点点,我不确定答案是什么。

基本上 - 是否存在在三态数据类型中使用哪些值的约定?做一些谷歌搜索,它看起来不像:我见过:

  • -1 = False,0 =未知/未定义,+ 1 =真
  • 0 = False,+ 1 = True,+ 2 =未知/未定义
  • -1 =未知/未定义,0 =假,+ 1 =真

..等等。如果有的话,我宁愿使用一个众所周知的约定。否则我会提出一个:-)很可能没有正确的答案,但只是想我会深入挖掘......

修改
在最近的代码中找到了这个Microsoft seem to use:-1 = true,0 = false,2 =未知。我假设 2 == unknown 意味着它只是在查看调试器/转储/内存中的原始值时解除了+ 1 / -1的歧义。奇怪的是,这个选项仅适用于仅此原因(消除了忘记1的变化意味着'真''的机会。)

4 个答案:

答案 0 :(得分:3)

据我所知,没有惯例。

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

  • 0 = False,-1 = True
  • 0 = False,1 = True

另一个相关的常见(但不是通用)约定是对未定义的值使用-1。

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

  • -1 =未定义
  • 0 = False
  • 1 = True

当然,我必须提到第三个状态当然不应该是未定义/未知,而是FileNotFound。 ;)

答案 1 :(得分:3)

无论你附加什么语义,我都会选择你的三个值作为一个负数,一个正数和零。这允许仅使用单个测试和分支(> 0,< 0,== 0,> = 0,< = 0)对3个可能值的每个可能的1或2个元素子集中的成员资格进行最佳测试。 ,!= 0)。

答案 2 :(得分:1)

我会说没有什么比约定,但我更喜欢你提到的第三种情况,因为我已经多次使用过这种情况。

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

我不喜欢前两种情况,因为纯布尔状态大多被确定为0 = False0 <> True所以它可能有点混乱。

答案 3 :(得分:0)

如果你正在寻找一个带有int的三态bool的替代品,你可以随时拥有nullable boolean,而不必担心标准。在C#bool? triState中有类似的东西。它可以有值true,false或null,可以认为是未知的 - 但我发现这不是你想要的。

我不知道约定。肯定不是来自这里给出的答案。我喜欢你的第三个。

但不同的观点,我的选择是:

{ True, Unknown, False } => 0, 1, 2 // going by enum like values...
编辑:经过@LarsTech的一个好点,我应该澄清一下。如果我知道变量可以有两个以上的值,那么我会认为它是一个枚举,因此我可以将它转换为{0,1,2}。我总是遵循这样的枚举值模式:“好,好,差”。它对我来说很自然,但对于许多人来说,真的有一个“0”是不受欢迎的。总是可以有相反的顺序。