3-состояние логическое? - PullRequest
4 голосов
/ 12 января 2011

Каков хороший способ создания логического выражения с тремя состояниями на языке Си?

Ответы [ 6 ]

21 голосов
/ 12 января 2011

В то время как другие предлагали ответы, я хотел бы предложить обоснование для лучшего.

Используйте целочисленные значения -1/0/1 (или действительно, любые отрицательные / ноль / положительные).

В этой схеме чрезвычайно эффективная проверка любого подмножества возможных значений:

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

В x86 все они скомпилируются в один код операции test, за которым следует код операции условного перехода с соответствующими условиями.

Если вы хотите скрыть реализацию, вы можете использовать макросы предикатов для тестирования каждого из 6 подмножеств.

13 голосов
/ 12 января 2011

Вместо того, чтобы просто использовать int напрямую? Вы могли бы typedef enum:

typedef enum {
   LOW      = 0,
   HIGH     = 1,
   TRISTATE = 2
} TriState;
1 голос
/ 12 января 2011

Вы можете использовать int: ноль, положительный и отрицательный, вероятно, будет лучшим способом для представления логического значения.

0 голосов
/ 29 мая 2017

Этот тип побеждает цель логического значения, он должен быть фундаментальной частью логики, которая либо включена, либо выключена.

Что вы можете сделать, это создать логический бит трехзначной логики, переключаядругая переменная, устанавливающая первую переменную 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

0 голосов
/ 12 января 2011
0 голосов
/ 12 января 2011

Как насчет int?или enum, что технически совпадает с int.

...