Является ли логическое отрицание нулевого (! 0) компилятора, зависящего от C?

Я наткнулся на статью, в которой упоминалось, что результат! 0 зависит от компилятора. Результатом может быть 1 или FF или FFFF и т.д.

Что касается стандарта C99 6.5.3.3 Унарные арифметические операторы,

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

Действительно ли он зависит от компилятора?

Ответы

Ответ 1

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

Таким образом, обо всем, что я могу догадаться, заключается в том, что вы спрашиваете, соответствуют ли все компиляторы C стандарту в этом отношении. Поскольку я не использовал каждый компилятор C, когда-либо написанный, я не могу ответить на этот вопрос окончательно. Я никогда не использовал и не слышал о том, что произвело какую-либо другую ценность, хотя, и, учитывая годы, которые я провел здесь, на Usenet и т.д., Кажется вероятным, что если бы такой зверь существовал, я бы, наверное, слышал его.

Изменить: возможно, стоит отметить, что даже в K & R1 он определенно описывается как производящий 0 или 1 (§A.7.2):

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

Ответ 2

Каждый компилятор должен иметь в своем описании список стандартов, которым они следуют. Конечно, это описание не всегда полностью верно (какой-то компилятор содержит ошибку или неверную интерпретацию стандартов), но это поведение с булевым так просто и так старо (приходит с первого дня C), что я был бы действительно удивлен, если новый компилятор ведут себя по-другому.

Таким образом, я всегда получал его как официальный стандарт, а также стандарт де-факто: (!0) = 1 и (!1) = 0, оба типа int.

Однако будьте осторожны, что в С++ логические операторы возвращают значение bool, поэтому, если вы скомпилируете на С++, будет использоваться bool, а не int. Однако bool и int являются взаимозаменяемыми, за исключением того, что некоторые компиляторы С++ предупреждают вас, если вы делаете что-то странное, например bool x = 10;.