Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 三态布尔?_C_Boolean_State - Fatal编程技术网

C 三态布尔?

C 三态布尔?,c,boolean,state,C,Boolean,State,在基于C的语言中创建三态布尔值的好方法是什么?您可以使用int:零、正和负可能是表示布尔值的最佳方法。而不是直接使用int?您可以typedef一个enum: typedef enum { LOW = 0, HIGH = 1, TRISTATE = 2 } TriState; 一个int怎么样?或者enum,这在技术上与int相同,请参见虽然其他人已经给出了答案,但我想为最好的答案提供一个理由 使用整数值-1/0/1(或者任何负/零/正) 使用此方案,可以非

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

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

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

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

一个
int
怎么样?或者
enum
,这在技术上与
int

相同,请参见

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

使用整数值-1/0/1(或者任何负/零/正)

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

(x<0)  /*   {-1} */
(!x)   /*    {0} */
(x>0)  /*    {1} */
(x<=0) /* {-1,0} */
(x)    /* {-1,1} */
(x>=0) /*  {0,1} */
(x0)/*{1}*/
(x=0)/*{0,1}*/
在x86上,所有这些都将编译为单个
测试
操作码,然后是具有适当条件的条件跳转操作码


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

这种类型违背了布尔值的目的,它应该是逻辑的基本部分,可以是开的,也可以是关的

您可以通过切换另一个变量来创建三值逻辑的逻辑位,在下次循环运行时将第一个变量设置为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);
}

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

这里有龙:取一个整数并使用-1,0,1?步骤1)不要将其称为布尔值^^^它现在是三值/状态(可能更晚)类型。我想到了“特罗林”,但也许这只是我记错了一些下流的书呆子笑话……你应该看看Boost的图书馆。什么?使用指针作为值类型?您如何区分
FALSE
NULL
?或者您是指指向
bool
NULL
bool*
。这真是太可怕了。。。。我想很明显我指的是
NULL
或指向false和true的指针,不是吗?@Oli:“或者你指的是指向
bool
NULL
bool*
”——哦?真正地有趣的那么从什么时候起,
bool*
可以指向
NULL
?这太可怕了。@R..:答案怎么会是个笑话?@1978年的黑暗:typedef和enum(单独或组合)与预处理器有什么关系?两者都是C语言本身的一部分,预处理器既不处理也不触及其中任何一个。您可能在这里混淆了枚举和定义吗?不幸的是,此实现不支持布尔逻辑或操作。一个完整的tribool实现,比如boost::logic::tribool更好。此外,这个实现允许轻松实现tribool操作。NOT=-1*值,和=MIN(值1,值2),或=MAX(值1,值2)。有关图表,请访问
>>>false
>>>false
>>>true