在基于C语言中创建3状态布尔值的好方法是什么?
答案 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
答案 6 :(得分:0)
这是一个很老的问题,这个建议现在可能已经无关紧要了,但是如果这个时间段的任何人遇到这个问题,你可以实现一个有效的三元逻辑布尔测试(即定义一个三值布尔值)变量)在 C# .NET 中使用可为空的 bool 类型。只需测试空值并将其视为程序流中的第三种可能状态/条件。