Что такое 0 в C?

Я знаю, что в C, если утверждения и сравнения FALSE = 0, а все остальное равно true.

Следовательно,

int j = 40
int k = !j

k == 0 // this is true

Мой вопрос обрабатывает обратное. Что получается 0? 1?

int l = 0
int m = !l

m == ? // what is m?

Ответ 1

Логические/логические операторы в C должны давать либо 0, либо 1.

Из раздела 6.5.3.3/5 стандарта ISO C99:

Результат оператора логического отрицания ! равен 0, если значение его операнда сравнивается с не равным 0, 1, если значение его операнда сравнивается с 0.

Фактически, !!x является общей идиомой для принудительного значения 0 или 1 (я лично предпочитаю x != 0, хотя).

Также см. Q9.2 из чата comp.lang.c.

Ответ 2

§6.5.3.3/5: "Результат оператора логического отрицания! равен 0, если значение его операнда сравнивается неравномерно с 0, 1, если значение его операнда сравнивается с равным 0. Результат имеет тип int."

Другие логические операторы (например, &&, ||) всегда производят либо 0, либо 1.

Ответ 3

Как правило, да, это станет 1. Если даже это гарантированное поведение (которое я не уверен), я бы подумал о коде, который полагался на это, чтобы быть довольно ужасным.

Вы можете предположить, что это истинное значение. Я бы больше ничего не предполагал.

Ответ 4

Оператор Bang (!) - это логический неоператор, обычно встречающийся в C, С++ и С#, поэтому

!0 == 1
!1 == 0

Это основано на языковой характеристике того, что интерпретируется как истинное или ложное... в более современных языках это было бы как это

!false == true
!true == false

См. DeMorgan Закон об истинных таблицах...

Ответ 5

!x будет расширяться до (x==0), поэтому:

  • если x = 0 → !x принимает значение от (0==0)= TRUE (значение 1)
  • если x!= 0 → !x принимает значение из (x==0)= FALSE (значение 0)