7

我有点装腔作势,我不确定答案是什么。

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

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

..在其他人中。如果有的话,我宁愿使用一个众所周知的约定。否则我会编一个:-)很可能没有正确的答案,但只是想我会更深入地挖掘......

编辑
发现微软似乎在最近的代码中使用了这个:-1 = true,0 = false,2 = not known。我假设有2 == unknown意味着它消除了在仅查看调试器/转储/内存等中的原始值时解释 +1/-1 的歧义。奇怪的是,这个选项仅出于这个原因而有吸引力(消除了忘记了 1 的哪个变化意味着“真实”)。

4

4 回答 4

3

To my knowledge, there is no convention for that.

There isn't even a single convention for a boolean value, the most common are:

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

Another common (but not universal) convention that would be relevant is the usage of -1 for undefined values.

If you choose to use -1 for undefined, you could use 0/1 for False/True:

  • -1 = Undefined
  • 0 = False
  • 1 = True

And naturally I have to mention that the third state should of course not be undefined/unknown, but FileNotFound. ;)

于 2011-06-07T11:34:25.530 回答
3

无论您附加何种语义含义,我都会选择您的三个值作为一个负数、一个正数和零。这允许对 3 个可能值的每个可能的 1 或 2 元素子集的成员资格进行最佳测试,只需一个测试和分支 (>0, <0, ==0, >=0, <=0, !=0 )。

于 2011-06-08T00:37:45.623 回答
1

我会说没有什么像约定那样,但我更喜欢你提到的第三种情况,因为我已经多次看到这种情况。

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

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

于 2011-06-07T11:22:50.090 回答
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”来说是不受欢迎的。一个人总是可以有相反的顺序。

于 2011-09-17T08:10:01.890 回答