Определены ли отрицательные логические значения?

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

(Я подумал об этом, когда увидел в вопросе, кто-то продвигает объявление "true" и "false" в enum как 1 и 0.)

Ответ 1

Это определено поведение. Я буду искать стандартный параграф C99, обозначающий как

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

Ответ 2

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

См. @casper здесь: поток

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

Ответ 3

Это правильное поведение, в C 0 False и все остальное True

Ответ 4

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

Объявление "true" и "false" в перечислении неверно, потому что тогда следующий код сломается:

if (2 == TRUE)

(2 должно оцениваться как "true", но если TRUE определено как 1, два значения не считаются равными).

Ответ 5

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

Я считаю, что недавно я выступал за использование 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) для явных тестов с булевыми значениями. Однако иногда бывает полезно иметь тип boolean:

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;
}

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

Также, как и у кого-то выше, лучше bool может быть:

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

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