三态布尔?

时间:2011-01-12 06:49:12

标签: c boolean state

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

7 个答案:

答案 0 :(得分:21)

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

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

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

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

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

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

答案 1 :(得分:13)

而不是直接使用int?您可以typedef enum

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

答案 5 :(得分:0)

这种做法违背了布尔的目的,它应该是一个基本的逻辑,无论是打开还是关闭。

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

#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

答案 6 :(得分:0)

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