C 三态布尔?
在基于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(或者任何负/零/正) 使用此方案,可以非
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