Я был удивлен этим кодом:
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
.
=!
- это не один оператор, а сочетание этих двух.
Эти типы вопросов просят ввести в заблуждение студентов, чтобы проверить их навыки кодирования.