Что это =! оператор?

Я был удивлен этим кодом:

if (a =! b) { // let it be on false
    ...
}

Но a никогда не назначается значением. Что этот оператор о?

Ответ 1

Это два оператора, = и !, а не один. Это может быть запутанный способ написания

a = !b;
if (a) {
    // whatever
}

значение a для логического инверсии b и проверки, является ли результат истинным (или, что эквивалентно, был ли b ложным).

Или это может быть ошибкой a != b.

Ответ 2

Давным-давно, когда динозавры бродили по земле, а C побежал на пятом выпуске UNIX на PDP-11, =! был оператором "не равно". Это использование было устаревшим благодаря созданию стандарта C, поэтому теперь оно означает "назначить логический обратный", как в a = !b. Это хороший аргумент для всегда окружающих двоичных операторов с пробелами, чтобы дать понять людям, читающим код, что думает компилятор.

Я немного удивлен, что никто не упомянул об этом, но опять же я могу быть единственным пользователем SO, который когда-либо касался компилятора C, который был старым.

Ответ 3

a присваивается логическое отрицание b в этой строке. Это просто неверно оформленный

if( a = !b ) {

... и злое скрытое назначение внутри условия.

Ответ 4

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!

Ответ 5

Операторы на С++

В соответствии с списком операторов C/С++ нет оператора, такого как =!. Однако существует оператор != ( Не равен, Операторы сравнения/реляционный оператор)

Есть две возможности.

  • Это может быть ошибка типографии, поскольку я заметил, что операторы =! находятся в if, а кто-то пытается ввести != вместо =!, потому что != - оператор сравнения, который возвращает true или ложь.
  • Возможно, разработчик пытался присвоить логическое отрицание b на a, и он совершил ошибку типографии и забыл поставить пробел после знака равенства. Так интерпретирует его компилятор. Согласно приоритет оператора в С++:
    • Оператор Прямое присвоение (=) приоритет 16 и Ассоциативность Справа налево

Ответ 6

Это два разных оператора: оператор = (присваивание) вместе с оператором !. В основном это можно перевести в присваивание a к отрицаемому значению b.

if (a = !b)

Но то, что пользователь, возможно, хотел написать, был оператором !=:

if (a != b)

Ответ 7

Это не один оператор, но это отличный способ обфускации кода.

Если бы это было написано 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, вероятно, является намерением автора.

Ответ 8

С++ не имеет оператора =!, что сразу же означает, что это оператор =, за которым следует оператор !. Итак, вы просто имеете a = !b в if.

Ответ 9

Это все о ясности кода:

Он должен быть записан как: if (a = !b)

if (a = !b) - это то же самое, что и если a назначен !b. Таким образом, используются технически 2 отдельных оператора, =, который является операцией присваивания, и !, который является логическим выражением.

Просто поставьте пространство между = и !, чтобы решить эту путаницу.

Ответ 10

Для этого могут быть три причины:

  • Это может быть ошибкой оператора !=, что означает не равное. Пример:

    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
    

Ответ 11

Я думаю, что это одна из ошибок в написании или печати. Потому что, если мы не сможем скомпилировать этот код, поскольку он содержит ошибку компиляции. И здесь это внутри if, возвращаемый тип должен быть логическим. Так как это возможно. Ответ просто ошибка или, как сказал Майк, запутанный способ писать.

И только тогда, когда обе переменные a и b являются логическими, которые будут скомпилированы как a, равно (не) b i.e(a =! b).

Ответ 12

Это можно сделать так: a присваивается !b.

Ответ 13

Я пытаюсь ответить на ваш вопрос и, соглашаясь с ответом Майка , просто добавляю.

Вы также можете понять это с помощью a=!!b.
Код a=!b возвращает 0 в a и a=!!b возвращает 1 в a.

=! - это не один оператор, а сочетание этих двух. Эти типы вопросов просят ввести в заблуждение студентов, чтобы проверить их навыки кодирования.