Прямое цитирование стандарта C11
, глава §6.5.3.3 (выделено мной).
Результатом операции логического отрицания !
является 0
, если значение его операнда при сравнении не равно 0
, 1
, если значение его операнда при сравнении равно 0
. Результат имеет тип int
....
Таким образом, результатом логического оператора !
является int
, поэтому !struct2.s
дает значение int
, а выражение
....(struct.s == !struct2.s)
создает проблему.
ПРИМЕЧАНИЕ 1:
Я предполагаю, что вы используете struct
в качестве имени структуры только для иллюстрации, в противном случае, struct
является зарезервированным ключевым словом в C
, вы не можете использовать его в качестве имени переменной.
ЗАМЕТКА 2:
Возможно, вы на самом деле имели в виду (struct.s != struct2.s)
, но это всего лишь (вероятное) предположение.
FOOTNOTE :: Предыдущий вопрос также помечал C++, перемещая его как сноску, но сохраняя информацию только для справки.
Что касается C++
, возвращаемый тип !
— bool
. Ссылка: C++11
, глава § 5.3.3 (опять же, мое выделение)
Операнд оператора логического отрицания !
в противном случае контекстуально преобразуется в bool(Clause 4); its value is
trueif the converted operand is
falseand false
. Тип результата – bool
.
person
Sourav Ghosh
schedule
24.06.2015
struct
— зарезервированное ключевое слово в C. Я бы не рекомендовал использовать его в качестве имени переменной. - person r3mainer   schedule 24.06.2015uint64_t
, что сделает вопрос только C. Зачем тогда добавлять тег C++? - person too honest for this site   schedule 24.06.2015