Что такое! 0 в C? - PullRequest
       4

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

18 голосов
/ 07 сентября 2010

Я знаю, что в C для операторов if и сравнений 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?

Ответы [ 5 ]

32 голосов
/ 07 сентября 2010

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

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

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

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

Также см. Q9.2 из FAQ по comp.lang.c .

3 голосов
/ 07 сентября 2010

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

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

1 голос
/ 07 сентября 2010

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

!0 == 1
!1 == 0

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

!false == true
!true == false

См. Деморган Закон о таблицах истинности ...

1 голос
/ 07 сентября 2010

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

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

0 голосов
/ 03 октября 2017

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

  • , если x = 0 -> !x, принять значение из (0==0) = ИСТИНА (значение 1)
  • если x! = 0 -> !x принять значение из (x==0) = FALSE (значение 0)
...