2012-05-01 2 views
1

В C true все, что не равно 0. (Но нередко мы используем перечисления для определения значений для состояний). Таким образом, чтобы сделать тесты истины, мы можем сделать следующее:Как обращаться с Tribools

typedef enum 
{ 
    FALSE, 
    TRUE 
} BOOL; 

// Some function 
BOOL n = isTrue(); 

if (n) 
{ 
    // Do something 
} 

Какие есть некоторые дебаты, но я и другие предпочитают:

if (n == TRUE) 
{ 
    // Do something 
} 

Но если по какой-то причине функция isTrue() возвращается значение кроме 1 для истины, то последнее не работает, и истина считается ложной.

Я проходил проверку кода, отмечая, что первым способом должен быть способ сделать это. Однако я вдруг понял, что иногда нам нужна идея третьего состояния, когда значение не было установлено. Но возможно ли это сделать и на C, и по-прежнему делать наши логические сравнения в первую очередь, как кажется, если мы присвоим любое другое значение этим значением «NULL», то оно все равно будет считаться истинным.

+0

ИМХО первый вариант ** не ** предпочтительнее второго. Второй - более читаемый, если у вас нет правильных имен переменных, таких как 'isBlue' и т. Д. – Matthias

+0

@Matthias, это, безусловно, предпочтительнее второго, если это просто по той причине, что' TRUE' - это ничего, что определено в стандарте , значение для использования - 'true' или' 1'. Но для «bool» первое действительно предпочтительнее. Можно было бы обсудить это для других типов, таких как указатели, но не для 'bool'. –

+0

Я не был уверен, что теперь существуют булевы как тип в стандартах C. В большинстве мест, которые я использовал, C имеет тенденцию иметь перечисление, определенное для TRUE и FALSE, которое, возможно, я должен был бы сделать более ясным выше – Firedragon

ответ

4

Нет. Вы потребует явного сравнения. Я хотел бы предложить, используя enum типа для ясности:

typedef enum { 
    FALSE = 0, 
    TRUE = 1, 
    FILENOTFOUND = 2 
} truth; 

Это приводит к довольно чистый код создает:

truth n; 

// ... 

switch (n) { 
case FALSE:   // Blah 
case TRUE:   // Blah 
case FILENOTFOUND: // Blah 
} 
+0

Спасибо за это. Я полагаю, что там, где типы могут иметь это третье состояние, имеющее их как определенный тип (например, typedef из TRIBOOL), подчеркивается, что вам нужно сравнивать с TRUE, FALSE или FILENOTFOUND (как в вашем примере).Я также считал, что у вас есть структура с «нулевым» флагом, это еще один вариант, но мне было любопытно узнать, есть ли рекомендация в более широком мире C – Firedragon

+0

@Firedragon: Да, точно. В моем примере typedef называется 'правдой'. –

+2

Потому что я не уверен, что Firedragon получит ссылку: http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx –

0

Как вы писали, все, что не 0 оценивает «истина». Это означает, что C буквально является неспособным идентифицировать третье состояние в описанных вами обстоятельствах: C различает только «false» (0) и «not-false» (т.е. «true», что есть что-то, что не является 0).

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

#DEFINE NOTSET -1 


if (a == NOTSET) { 
    /* Stuff that happens when a is not set*/ 
} 

else if (a) { 
    /* Stuff that happens when a is true*/ 
} 

else { 
    /*Stuff that happens when a is false*/ 
} 

, но я, честно говоря, не рекомендовал бы его.

+0

Действительно, это не рекомендуется, потому что случайное переключение порядка сравнений приведет к поломке кода. –

+2

Вы по-прежнему видите это время от времени - вот почему я подумал, что я упоминаю об этом, но это плохая идея, я согласен. – Yuka

+0

Я согласен, что это выглядит как хакерский способ сделать это, но полезно показать, что это «можно» сделать таким образом. Иногда показывая способ сделать это и говорить, почему вы не должны хорошо учиться, я думаю, в случае, если это когда-либо видели в коде, с которым нужно работать. – Firedragon

1

У меня возникнет соблазн выбрать int. Вы можете использовать числа -ve для false, + ve для истины и нуля для «не знаю».

Вам все равно нужно быть осторожным, чтобы не использовать его как if (thing), но у вас есть эта проблема и с другими.

Смежные вопросы