Двойное отрицание в C: гарантировано ли оно вернуть 0/1?

Является !!(x) гарантированным стандартом для возврата 0/1?

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

Ответ 1

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

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

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

Для других операторов, на C99, см. также Является ли "true" результат > , <, && &, & thetas; или == определено?

Ответ 2

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

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

Это говорит о двойном отрицании:

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

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