在基于C语言中创建三态布尔值的好方法是什么?
wribegjk1#
虽然其他人已经给出了答案,但我想为最好的答案提供一个理由。使用整数值-1/0/1(或者实际上,任何负/零/正)。利用该方案,存在对可能值的任何子集的极其有效的检查:
(x<0) /* {-1} */ (!x) /* {0} */ (x>0) /* {1} */ (x<=0) /* {-1,0} */ (x) /* {-1,1} */ (x>=0) /* {0,1} */
在x86上,所有这些都将编译为一个test操作码,后跟一个具有适当条件的条件跳转操作码。如果您想隐藏实现,可以使用 predicate 宏来测试6个子集中的每一个。
test
fkvaft9z2#
除了直接使用int之外,您还可以使用typedef和enum:
int
typedef
enum
typedef enum { LOW = 0, HIGH = 1, TRISTATE = 2 } TriState;
q35jwt9p3#
参见Default value for bool in C++
5lwkijsr4#
您可以使用int:零、正和负可能是表示布尔值的最佳方式。
ruyhziif5#
在C# .NET中,您可以使用可为空的 bool 类型实现trinary逻辑布尔测试(即定义一个三值布尔变量)。只需测试空值,并将其视为程序流中的第三个可能状态/条件。
z4bn682m6#
int或enum怎么样?enum在技术上与int相同。
cczfrluj7#
这就违背了布尔值的目的,它应该是一个基本的逻辑,要么开,要么关。通过切换另一个变量,在下一次循环运行时将第一个变量设置为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
7条答案
按热度按时间wribegjk1#
虽然其他人已经给出了答案,但我想为最好的答案提供一个理由。
使用整数值-1/0/1(或者实际上,任何负/零/正)。
利用该方案,存在对可能值的任何子集的极其有效的检查:
在x86上,所有这些都将编译为一个
test
操作码,后跟一个具有适当条件的条件跳转操作码。如果您想隐藏实现,可以使用 predicate 宏来测试6个子集中的每一个。
fkvaft9z2#
除了直接使用
int
之外,您还可以使用typedef
和enum
:q35jwt9p3#
参见Default value for bool in C++
5lwkijsr4#
您可以使用
int
:零、正和负可能是表示布尔值的最佳方式。ruyhziif5#
在C# .NET中,您可以使用可为空的 bool 类型实现trinary逻辑布尔测试(即定义一个三值布尔变量)。只需测试空值,并将其视为程序流中的第三个可能状态/条件。
z4bn682m6#
int
或enum
怎么样?enum
在技术上与int
相同。cczfrluj7#
这就违背了布尔值的目的,它应该是一个基本的逻辑,要么开,要么关。
通过切换另一个变量,在下一次循环运行时将第一个变量设置为true,然后在下一次循环中立即将第一个变量恢复为false,可以创建三值逻辑的逻辑位。
https://cg5.tutorialspoint.com/share/452/pp3aLdgP