Что это =! оператор? [дубликат]



этот вопрос уже есть ответ здесь:




  • Что значит "=!- оператор есть?

    6 ответов



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



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


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

623   13  

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 / C++ нет оператора, такого как =!. Однако, есть оператор != (не равно,операторы сравнения / оператор отношения)

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

  1. это может быть опечатка, как я заметил, что =! операторов в if заявление и кто-то пытается типа != вместо =!, потому что != - Это оператор сравнения, который возвращает true или false.
  2. возможно, разработчик пытался присвоить логическое отрицание 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 вероятно, это намерение автора.

C++ не имеет =! оператор, что сразу означает, что это

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

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

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

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

для этого может быть три причины:

  1. это может быть опечатка != оператор, что означает не равно. пример:

    if (a != b) {
        // a is not equal to b
    }
    
  2. это может быть опечаток a == !b, что означает a равна не b, который чаще всего используется с булевыми значениями. пример:

    if (a == !b) {
        // The boolean a is equal to not b (a is not equal to b)
    }
    
  3. это может быть попытка назначить a к инверсия b. пример:

    bool a = !b; // Sets a to the opposite of b
    

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

и только возможно, если обе переменные a и b являются булевыми, которые будут скомпилированы как a равно (не)b Я.е ( = !си. )

Это можно принять как a назначена !b.

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

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

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

Comments

    Ничего не найдено.