Директно цитиране на стандарта 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)
, но това също е само (вероятно) предположение.
БЕЛЕЖКА ПОД ЛИНИЯ :: По-ранен въпрос също маркира 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++-tag? - person too honest for this site   schedule 24.06.2015