13 ответов:
это два оператора,
=и!, а не один. Это может быть запутанный способ написанияa = !b; if (a) { // whatever }задание
aк логическому обратномуb, и проверка того, является ли результат истинным (или, что эквивалентно, является лиbбыло ложным).или это может быть опечатка
a != b.
давным-давно, когда динозавры бродили по земле и C побежал на 5-м издании UNIX на PDP-11s,
=!был оператор 'not equals'. Это использование было осуждено созданием Стандартный C, так что теперь это означает "назначить логическое обратное", как вa = !b. Это хороший аргумент для всегда окружающих двоичных операторов с пробелами, просто чтобы сделать его понятным для люди чтение кода, что компилятор думает.Я немного удивлен никто другой упомянул об этом, но опять же я могу быть единственным пользователем SO, который когда-либо касался компилятора C, который был старым.
aприсваивается логическое отрицаниеbв этой строке. Это просто искаженныйif( a = !b ) {... и злое скрытое назначение внутри условия.
a =! bэто просто забавный способ положить
a = !bт. е. задание
not bдоa.значение выражения
aпосле выполнения задания.С кодом ниже вы можете увидеть, что значение выражения
a = !bи!false(т. е.true), и вы можете увидеть, что назначение состоялось, проверив значениеa, который такжеtrue.#include <iostream> int main() { bool a = false; bool b = false; if(a) printf("a is true!\n"); else printf("a is false!\n"); if(a = !b) printf("expression is true!\n"); else printf("expression is false!\n"); if(a) printf("a is true!\n"); else printf("a is false!\n"); }результат:
a is false! expression is true! a is true!
согласно списку операторов C / C++ нет оператора, такого как
=!. Однако, есть оператор!=(не равно,операторы сравнения / оператор отношения)есть две возможности.
- это может быть опечатка, как я заметил, что
=!операторов вifзаявление и кто-то пытается типа!=вместо=!, потому что!=- Это оператор сравнения, который возвращает true или false.- возможно, разработчик пытался присвоить логическое отрицание
bдоaи он / она сделал опечатку и забыл поставить пробел после знака равенства. Это как компилятор интерпретирует его, в любом случае. Согласно приоритет оператора в c++:
- оператор логическое не (
!) приоритет и 3 и ассоциативность и справа-налево- оператор прямое назначение (=) верх и 16 и ассоциативность и справа-налево
это два разных оператора:
=(присваивание) оператор вместе с!оператора. Он может быть в основном переведен на присвоениеaв отрицательное значениеb.if (a = !b)но то, что пользователь, вероятно, хотел написать, было
!=оператор:if (a != b)
это не один оператор, это, однако, отличный способ запутать код.
если бы это было написано
a=!bвместо этого пробел может не привести вас к мысли, что это был один оператор.компиляторы имеют предупреждения для назначения в условном выражении, если вы не обернете весь оператор в набор скобок, и это прекрасный пример того, когда это предупреждение было бы полезно.
оба эти утверждения функционально идентичные, но один генерирует предупреждение, а другой-нет:
if (a =! b) // Generates a warning with `-Wparentheses` (gcc) if ((a =! b)) // No such warning- Wparentheses
предупреждать, если скобки опущены в определенных контекстах, например, когда есть назначение в контексте, где ожидается значение истинности, или когда операторы вложены, о приоритете которых люди часто путаются.
это, конечно, предполагает, что вы ответственный программист, а на самом деле прочитайте предупреждения, которые ваш компилятор выплевывает.
используя пробел более разумным способом, утверждение на самом деле:
if (a = !b) // Assign A the value of (logical) NOT B and then test the truthпредупреждение компилятора, упомянутое выше, действительно полезно в том случае, когда человек, написавший этот код, случайно транспонировал
!и=. Однако из загадочных встроенных комментариев в вашем исходном вопросе,a = !bвероятно, это намерение автора.
это все о ясности кода:
это должно быть написано как:
if (a = !b)
if (a = !b)Это то же самое, что сказать, еслиaназначена!b. Таким образом, технически используются 2 отдельных оператора,=который является операцией назначения, и!что является логическим выражением.просто поставить пробел между
=и!решает эту путаницу.
для этого может быть три причины:
это может быть опечатка
!=оператор, что означает не равно. пример:if (a != b) { // a is not equal to b }это может быть опечаток
a == !b, что означаетaравна неb, который чаще всего используется с булевыми значениями. пример:if (a == !b) { // The boolean a is equal to not b (a is not equal to b) }это может быть попытка назначить
aк инверсияb. пример:bool a = !b; // Sets a to the opposite of b
Я думаю, что это одна из ошибок написания или печати. Потому что если мы не можем скомпилировать этот код, поскольку он содержит ошибку compiletime. И вот это внутри если предложение, возвращаемый тип должен быть логическим. Так как же это возможно. Ответ просто ошибка или как сказал Майк скрытый способ написания.
и только возможно, если обе переменные a и b являются булевыми, которые будут скомпилированы как a равно (не)b Я.е ( = !си. )
Я пытаюсь ответить на ваш вопрос и, в согласии с Майком ответ, я просто складываю.
вы также можете понять это
a=!!b.
Кодa=!bвозвращает0доaиa=!!bвозвращает1доa.The
=!это не один оператор, а сочетание этих двух. Эти типы вопросов задаются, чтобы ввести студентов в заблуждение Проверьте свои навыки программирования.
Comments