【问题标题】:3-State Boolean?三态布尔?
【发布时间】:2011-01-12 06:49:12
【问题描述】:

在基于 C 的语言中创建三态布尔值的好方法是什么?

【问题讨论】:

  • 取一个整数并使用-1,0,1?
  • 第 1 步)不要称它为布尔值 ^^ 现在它是三值/状态(也许以后还有更多)类型。 “troolean”浮现在脑海中,但也许这只是我 [mis-] 记得一些俗气的书呆子笑话......
  • 你应该看看来自 Boost 的 tribool 库。

标签: c boolean state


【解决方案1】:

虽然其他人已经提供了答案,但我想为最好的答案提供一个理由。

使用整数值 -1/0/1(或者实际上,任何负数/零/正数)。

使用此方案,可以非常有效地检查任何可能值的子集:

(x<0)  /*   {-1} */
(!x)   /*    {0} */
(x>0)  /*    {1} */
(x<=0) /* {-1,0} */
(x)    /* {-1,1} */
(x>=0) /*  {0,1} */

在 x86 上,所有这些都将编译为单个 test 操作码,然后是具有适当条件的条件跳转操作码。

如果要隐藏实现,可以使用谓词宏来测试 6 个子集中的每一个。

【讨论】:

  • 此外,此实现允许轻松实现 tribool 操作。非 = -1 * 值,与 = 最小值(值 1,值 2),或 = 最大值(值 1,值 2)。图表可以在en.wikipedia.org/wiki/Three-valued_logic找到
【解决方案2】:

而不是直接使用int?你可以typedefenum

typedef enum {
   LOW      = 0,
   HIGH     = 1,
   TRISTATE = 2
} TriState;

【讨论】:

  • 不幸的是,这个实现不支持布尔逻辑或操作。一个完整的 tribool 实现,比如 boost::logic::tribool 会更好。
【解决方案3】:

【讨论】:

    【解决方案4】:

    您可以使用int:零、正数和负数可能是表示布尔值的最佳方式。

    【讨论】:

    • 什么?使用指针作为值类型?你如何区分FALSENULL?或者您的意思是指向boolNULLbool*。这真是令人难以置信的严峻。
    • ... 我认为我的意思很明显,我的意思是 NULL指针 指向 false 和 true,不是吗?
    • @Oli:“或者你的意思是指向boolNULLbool*”——哦?真的吗?好笑...所以bool* 什么时候可以指向NULL?这真是令人难以置信的严峻。
    • @R..: 答案怎么是笑话?
    • @TheDarkIn1978:typedef 和 enum(单独或组合)与预处理器有什么关系?两者都是 C 语言本身的一部分,预处理器既不处理也不接触任何一个。你能在这里混淆枚举和定义吗?
    【解决方案5】:

    这是一个老问题了,这个建议现在可能已经无关紧要了,但是如果这个时间段的任何人遇到这个,你可以实现一个三元逻辑布尔测试(即定义一个三值布尔变量)在 C# .NET 中使用可为空的 bool 类型。只需测试空值并将其视为程序流中的第三种可能状态/条件。

    【讨论】:

      【解决方案6】:

      int 怎么样?或enum,技术上与int 相同。

      【讨论】:

        【解决方案7】:

        这违背了布尔值的目的,它应该是一个基本的逻辑部分,要么开启要么关闭。

        您可以做的是通过切换另一个变量来创建三值逻辑的逻辑位,在下一次循环运行时将第一个变量设置为 true,然后在下一次循环后立即将第一个变量恢复为 false。

        #include<stdio.h>
        #include<stdbool.h> // required, native C has "booleans" but they're just ints
        
        int main() {
            bool ternary = false;
            bool toggler = false;
        
            if (ternary == false) {
                if (toggler == false) {
                    toggler = true;
                } else {
                    toggler = false;
        
                    ternary = true;
                }
            } else {
                ternary = false;
            }
        
          printf("%d\n", ternary);
        }
        
        >>>false
        >>>false
        >>>true
        

        https://cg5.tutorialspoint.com/share/452/pp3aLdgP

        【讨论】:

          猜你喜欢
          • 2011-05-23
          • 1970-01-01
          • 2011-07-16
          • 1970-01-01
          • 2019-11-10
          • 1970-01-01
          • 2013-09-12
          • 2017-11-08
          • 2020-08-15
          相关资源
          最近更新 更多