Я был удивлен этим кодом:
if (a =! b) { // let it be on false
    ...
}
Но a никогда не назначается значением. Что этот оператор о?
Я был удивлен этим кодом:
if (a =! b) { // let it be on false
    ...
}
Но a никогда не назначается значением. Что этот оператор о?
Это два оператора, = и !, а не один. Это может быть запутанный способ написания
a = !b;
if (a) {
    // whatever
}
значение a для логического инверсии b и проверки, является ли результат истинным (или, что эквивалентно, был ли b ложным).
Или это может быть ошибкой a != b.
Давным-давно, когда динозавры бродили по земле, а C побежал на пятом выпуске UNIX на PDP-11, =! был оператором "не равно". Это использование было устаревшим благодаря созданию стандарта 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/С++ нет оператора, такого как =!. Однако существует оператор != ( Не равен, Операторы сравнения/реляционный оператор)
=! находятся в if, а кто-то пытается ввести != вместо =!, потому что != - оператор сравнения, который возвращает true или ложь.b на a, и он совершил ошибку типографии и забыл поставить пробел после знака равенства. Так интерпретирует его компилятор.
Согласно  приоритет оператора в С++:
Это два разных оператора: оператор = (присваивание) вместе с оператором !. В основном это можно перевести в присваивание 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, вероятно, является намерением автора.
С++ не имеет оператора =!, что сразу же означает, что это оператор =, за которым следует оператор !. Итак, вы просто имеете a = !b в if.
Это все о ясности кода:
Он должен быть записан как: 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
Я думаю, что это одна из ошибок в написании или печати. Потому что, если мы не сможем скомпилировать этот код, поскольку он содержит ошибку компиляции. И здесь это внутри if, возвращаемый тип должен быть логическим. Так как это возможно. Ответ просто ошибка или, как сказал Майк, запутанный способ писать.
И только тогда, когда обе переменные a и b являются логическими, которые будут скомпилированы как a, равно (не) b i.e(a =! b).
Это можно сделать так: a присваивается !b.
Я пытаюсь ответить на ваш вопрос и, соглашаясь с ответом Майка , просто добавляю.
Вы также можете понять это с помощью a=!!b. 
Код a=!b возвращает 0 в a и a=!!b возвращает 1 в a.
 =! - это не один оператор, а сочетание этих двух.
Эти типы вопросов просят ввести в заблуждение студентов, чтобы проверить их навыки кодирования.