2010-09-07 4 views
16

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

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

int j = 40 
int k = !j 

k == 0 // this is true 

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

int l = 0 
int m = !l 

m == ? // what is m? 
+12

Почему бы не попробовать? –

+1

@Josh K: Идеальный совет. Я хочу, чтобы все сначала попробовали его, а затем спросили о результатах, которые они * на самом деле получили. –

+13

@Josh K: потому что он может варьироваться в зависимости от компилятора/стандарта/дня недели (если это не определено поведение, например, хотя, очевидно, это и есть в данном случае), поэтому просмотр одного результата может неточно отражать то, что оно будет на любой другой заданной настройке. –

ответ

30

булевых/логических операторов в C являются требует d с получением либо 0, либо 1.

Из секции 6.5.3.3/5 стандарта ISO C99:

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

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

См. Также Q9.2 from the comp.lang.c FAQ.

+3

Хороший звонок. Похоже, нам больше нужно читать проклятый стандарт ИСО. –

+4

+1 для указания на стандарт, но код, который использует '!!', должен направляться прямо в мусорную корзину. –

+0

Конечно, не многие компиляторы C чувствуют себя особенно вынужденными следовать стандарту ISO. Вероятно, GCC, но с кем-то еще его дерьмо. –

1

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

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

+8

Не только в целом; *всегда*. Булевы операторы в C должны возвращать либо 0, либо 1. – jamesdlin

+0

Тем не менее, это похоже на нарушение намерения показать код. –

+2

Совсем нет. Такие вещи, как 'prefix =" - "+! Neg;', являются абсолютно разумными C. –

1

Бэнг оператор (!) Является логическим не оператор нашел обычно в C, C++ и C#, так

!0 == 1 
!1 == 0 

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

!false == true 
!true == false 

См DeMorgan закона относительно таблиц истинности ...

+3

На самом деле, в C++ '!' Принимает операнд 'bool' и выдает результат' bool', хотя для обратной совместимости существуют неявные преобразования от 'bool' до' int', причем 'true' конвертируется в' 1 'и' false' до '0', а из других целых типов -' bool', с '0' конвертируется в' false' и любое другое значение, преобразующееся в 'true'. –

3

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

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

0

!x будет расширяться (x==0) так:

  • если х = 0 ->!x значение берут из (0==0) = TRUE (значение 1)
  • если х = 0 ->!x принимает значение от (x==0)! = FALSE (значение 0)