Определены ли отрицательные логические значения?
В 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, но я могу ошибаться, и это хорошо работает в любом случае.