двойное отрицание в C: гарантированно вернется 0/1? - PullRequest
36 голосов
/ 23 декабря 2011

Гарантируется ли !!(x) по стандарту возврат 0/1?

Обратите внимание, что я не спрашиваю о c ++, где определен тип bool.

Ответы [ 2 ]

45 голосов
/ 23 декабря 2011

Да, в C99, см. §6.5.3.3 / 4:

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

То есть !x и !!y могут давать только 0 или 1, как int с.

Для других операторов, в C99, см. Также Является ли "истинный" результат>, <,!, &&, || или == определено? </a>

14 голосов
/ 23 декабря 2011

Это действительно комментарий, но он слишком длинный.(Пожалуйста, не голосуйте только на этой основе.)

Я нашел очень странный документ, когда искал стандарт, чтобы ответить на ваш вопрос: Новый стандарт C: Экономический иКомментарий к культуре. И они говорят, что академическое финансирование недостаточно.( Здесь - это полный PDF-файл размером 1083 МБ в формате 2083 страницы. Предыдущая ссылка - это просто раздел о двойном отрицании.)

Здесь можно сказать о двойном отрицании:

Двойное отрицание очень часто интерпретируется как положительное утверждение на английском языке (например, «Неизвестно, что двойные отрицания встречаются в источнике C»).Та же самая семантика, которая применяется в C. Однако в некоторых языках (например, в испанском) двойной отрицательный знак интерпретируется как делающий утверждение более отрицательным (такое использование встречается в обычной английской речи, например, «вы еще ничего не видели»), но это редко и не одобряется в социальном отношении 1 ).

Я полагаю, что автор был бы счастлив, зная, что это бесполезно при ответе на ваш реальный вопрос (ответ на который да.)

...