2010-11-23 3 views
10

В C по крайней мере каждое положительное значение, кроме 0, рассматривается как логическое значение true. Но как насчет отрицательной ценности? Я сделал несколько тестов, и кажется, что и отрицательные значения рассматриваются как логические истины. Является ли это определенным поведением или реализацией?Определены отрицательные булевы значения?

(я пришел к мысли об этом, когда я увидел в вопросе, кто-то продвижение объявляя «истина» и «ложь» в перечислении как 1 и 0.)

+0

Все, что не является «ложным», является «истинным»? – khachik 2010-11-23 09:11:29

+0

Я думаю, что это http://stackoverflow.com/questions/727196/boolean-true-positive-1-or-negative-1 ответит на ваш вопрос – 2010-11-23 09:27:43

ответ

23

Это определенное поведение. Я буду искать стандартный пункт C99 о том, как такой

§ 6.3.1.2
Когда любое скалярное значение преобразуется в _Bool, результат 0, если значение сравнивается равно 0; в противном случае, результат равен 1.

+2

+1 для указания стандарта. – Jay 2010-11-23 09:19:43

+0

+1 Стандарт `bool` хорош. Я использую `enum` в качестве резервной копии, если конкретный компилятор не поддерживает C99. – 2010-11-23 09:20:43

1

В C нет булевского типа; 0 и 0.0f считаются «ложными» в булевых контекстах, все остальное «истинно».

Декларирование «истина» и «ложь» в перечислении является неправильным, потому что тогда следующий код сломается:

if (2 == TRUE) 

(2 следует оценивать как «истинный», но если TRUE, было определено как 1 , два значения не считаются равными).

2

Я считаю, что 0 является ложным, а все остальное является истинным. ответ

Знакомства @ Каспер здесь: thread

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

2

Это правильное поведение, в C является Ложные и все остальное является Правда

-1

C определяет 0 как ложное и все остальное, как верно. Положительный, отрицательный, любой.

Я считаю, что недавно я выступал за использование typedef enum { false, true } bool;, поэтому я буду владеть этим. (Если мой исходный код не имеет typedef участие, это был просчет с моей стороны.) Все ненулевые значения являются истинными, так что я не выступаю с использованием перечисленного bool типа для таких вещей, как это:

if(x == true) // not what you want 
if(!x == false) // works, but why so much effort? 

Я обычно передаю просто if(x) или if(!x) для явных тестов по булевым значениям. Тем не менее, иногда это хорошо иметь логический тип:

bool is_something(int x) 
{ // assume for the sake of an argument that the test is reasonably complex 
    if(/* something */) return false; 
    if(/* something else */) return true; 
    return false; 
} 

Это не лучше, чем тип будет int, но по крайней мере вы быть четко с тем, что результат предназначен.

Кроме того, как на кого-то еще выше, лучше bool может быть:

typedef enum { false, true = !false } bool; 

Я считаю, что ! гарантированно возвращает 0 или 1, но я могу ошибаться, и выше работает хорошо в любом случае.

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