Вопрос о С! оператор - PullRequest
3 голосов
/ 08 апреля 2011

Я понимаю это следующим образом. В Си оператор ! возвращает 0, если ему дано ненулевое значение, и возвращает ненулевое значение, если ему дано 0.

Скажем, у вас есть небольшой фрагмент кода C:

int y = 0;
int z = !y;

Какое значение войдет в z? Нужно ли просто !0 быть 1? Это зависит от системы? Стандарт C определяет, что должно произойти? Сегодня вечером я столкнулся с этими вопросами, выполняя домашнюю работу, касающуюся целочисленной манипуляции с 2-мя дополнительными числами. У меня определенная проблема с работой, но я как бы чешу голову по поводу , почему это работает. Большое спасибо за любую информацию!

Ответы [ 3 ]

8 голосов
/ 08 апреля 2011

Значения истины, "генерируемые" C, всегда равны 0 или 1.

Это правда (хех), что ненулевое выражение обычно считается "истинным" в if и т. Д., Но когдасам язык должен генерировать значение истинности, которое он использует 0 для false и 1 для true.

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

Таким образом, в вашем случае z будет установлено на 1.

Обновление : см. эту запись FAQ для дальнейшего обсуждения, это то, что я имел в виду"сгенерированный" формулировка.Удивительно, но у него даже такой же каламбур (я не просматривал эту запись до того, как написал свой ответ).Не уверен, что это признак того, что у меня хорошее чувство юмора или нет.

4 голосов
/ 08 апреля 2011

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

3 голосов
/ 08 апреля 2011

Результат логического отрицания оператор! 0, если значение его операнд сравнивает неравный 0, 1, если значение его операнда сравнивается равно 0. Результат имеет тип int. Выражение! E эквивалентно (0 == Е).

Из раздела 6.5.3.3 стандарта C (n1124).

...