Я знаю, что в 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?
Я знаю, что в 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?
Логические/логические операторы в C должны давать либо 0, либо 1.
Из раздела 6.5.3.3/5 стандарта ISO C99:
Результат оператора логического отрицания
!
равен 0, если значение его операнда сравнивается с не равным 0, 1, если значение его операнда сравнивается с 0.
Фактически, !!x
является общей идиомой для принудительного значения 0 или 1 (я лично предпочитаю x != 0
, хотя).
Также см. Q9.2 из чата comp.lang.c.
§6.5.3.3/5: "Результат оператора логического отрицания! равен 0, если значение его операнда сравнивается неравномерно с 0, 1, если значение его операнда сравнивается с равным 0. Результат имеет тип int."
Другие логические операторы (например, &&
, ||
) всегда производят либо 0, либо 1.
Как правило, да, это станет 1. Если даже это гарантированное поведение (которое я не уверен), я бы подумал о коде, который полагался на это, чтобы быть довольно ужасным.
Вы можете предположить, что это истинное значение. Я бы больше ничего не предполагал.
Оператор Bang (!) - это логический неоператор, обычно встречающийся в C, С++ и С#, поэтому
!0 == 1
!1 == 0
Это основано на языковой характеристике того, что интерпретируется как истинное или ложное... в более современных языках это было бы как это
!false == true
!true == false
См. DeMorgan Закон об истинных таблицах...
!x
будет расширяться до (x==0)
, поэтому:
!x
принимает значение от (0==0)
= TRUE (значение 1)!x
принимает значение из (x==0)
= FALSE (значение 0)