Определены ли отрицательные логические значения? - PullRequest
10 голосов
/ 23 ноября 2010

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

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

Ответы [ 5 ]

23 голосов
/ 23 ноября 2010

Это определенное поведение.Я поищу стандартный абзац C99, в котором говорится:

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

2 голосов
/ 23 ноября 2010

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

2 голосов
/ 23 ноября 2010

Я верю, что 0 - это ложь, а все остальное - правда.

Смотрите ответ @ casper здесь: тема

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

1 голос
/ 23 ноября 2010

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

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

if (2 == TRUE)

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

0 голосов
/ 23 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...