Разница между «! ==» и «==!» [закрыто]

162

Вчера я наткнулся на это, когда изменил код PHP, написанный кем-то другим. Я был озадачен тем, что простое сравнение ( if ($var ==! " ")) не сработало, как ожидалось. После некоторого тестирования я понял, что тот, кто написал этот код, использовал ==!вместо !==оператора сравнения. Я никогда не видел ни ==!на одном языке, поэтому я удивился, как, черт возьми, этот код мог работать, и провел некоторое тестирование:

<?php
echo "int\n";
echo "1 !== 0: "; var_dump(1 !== 0);
echo "1 !== 1: "; var_dump(1 !== 1);
echo "1 ==! 0: "; var_dump(1 ==! 0);
echo "1 ==! 1: "; var_dump(1 ==! 1);
echo "bool\n";
echo "true !== false: "; var_dump(true !== false);
echo "true !== true: "; var_dump(true !== true);
echo "true ==! false: "; var_dump(true ==! false);
echo "true ==! true: "; var_dump(true ==! true);
echo "string\n";
echo '"a" !== " ": '; var_dump("a" !== " ");
echo '"a" !== "a": '; var_dump("a" !== "a");
echo '"a" ==! " ": '; var_dump("a" ==! " ");
echo '"a" ==! "a": '; var_dump("a" ==! "a");
?>

Это производит этот вывод:

int
1 !== 0: bool(true)
1 !== 1: bool(false)
1 ==! 0: bool(true)
1 ==! 1: bool(false)
bool
true !== false: bool(true)
true !== true: bool(false)
true ==! false: bool(true)
true ==! true: bool(false)
string
"a" !== " ": bool(true)
"a" !== "a": bool(false)
"a" ==! " ": bool(false)
"a" ==! "a": bool(false)

Оператор, кажется, работает для логических и целочисленных переменных, но не для строк. Я не могу найти ==!в документации PHP или что-нибудь об этом ни в одной поисковой системе (пробовал Google, Bing, DuckDuckGo, но я подозреваю, что они пытаются интерпретировать его вместо поиска буквальной строки). Кто-нибудь видел это раньше и может пролить свет на это поведение?

Джеральд Шнайдер
источник
57
давай ... что с upvotes? Я могу сделать еще дюжину таких вопросов. И сопровождать их квази-серьезным анализом. Это стандартная учебная практика, нет. В SO мы голосуем за качество и информацию, а не за развлечения и развлечения.
Сех
51
@sehe Он получает отклик, потому что это определение хорошо изученного вопроса - он «тщательно искал ответ», «был конкретен», вопрос «актуален для других» и «по теме». ОП попробовал что-то и показал нам, что он пытался; Это тот вопрос, который пытается
развить
11
@JRaymond: он получает отклик, потому что это вопрос пустяков для очень простой для понимания проблемы и ответа. Аспект пустяков увеличивает любопытство, которое привлекает больше людей, а легкий аспект увеличивает процент тех людей, которые понимают вопрос и ответ достаточно, чтобы проголосовать за него. Это не связано с тем, что это хороший вопрос или нет.
Томас Бонини
4
@JRaymond, признай это, большинство вопросов с высоким голосом - пустяки. Взгляните на эти три моих вопроса среди многих других: 1 , 2 , 3 . Ни один из них не является чем-то, что вы можете просто найти в Google (в отличие от большинства вопросов с высоким рейтингом), и они хорошо продуманы и попробованы перед тем, как их написать (я знаю, потому что я их написал). Однако, поскольку это вопросы, требующие экспертизы, они никогда не получают высоких голосов. Вот как система работает здесь.
Шахбаз
3
@JRaymond Sehe прав. У писателей будет полевой день на SO. Я бы посоветовал пройтись по этому списку ( php.net/quickref.php ) и столкнуться с интересными проблемами, где функция является решением. Чем более непонятна и интересна ситуация или функция, тем больше голосов.
Майк Б

Ответы:

243

Разница в том, что нет оператора ==!.

Это выражение:

$a ==! $b

В основном так же, как это:

$a == (!$b)
Банг Дао
источник
10
Вау, много хороших ответов за такое короткое время. Я выбрал первый ответ, который уточнил, что! применяется к правой переменной и, следовательно, имеет наибольшее значение. Извините за других парней;)
Джеральд Шнайдер
4
@ Джеральд Шнайдер: Наименьшее, что вы могли бы сделать, чтобы восполнить это, было улучшить этот ответ так, чтобы он был по крайней мере наравне с другими ответами с точки зрения грамматики и форматирования (один из которых вы специально призвали для его очень подробного объяснения !). Но независимо от того, я редактировал это сейчас.
BoltClock
Я даже не программирую на PHP, и даже я понял, что "==!" будет читаться как 2 оператора "==" и "!". Это просто показывает, как мало влияет макет на то, как вы читаете что-то.
StarNamer
2
@ Банг Дао Хм, JavaScript? Он имеет === и! ==. Но нет ==!
PSR
2
@BangDao Теперь вы нашли другую причину для w3fools Пожалуйста, прочитайте это, это важно.
некоторые
77

В ==!PHP нет оператора

Это просто сочетание ==и !. Здесь присутствует только соответствующий оператор ==. Таким образом, комбинация ==!будет работать как обычно ==, проверяя Equality, и поверьте мне,

$variable_a ==! $variable_b 

не кто иной, как

$variable_a == (!$variable_b)

и поэтому;

"a" ==! " ": bool(false)
"a" ==! "a": bool(false) //is same as "a" == (!"a")

И

true ==! false: bool(true)
true ==! true: bool(false)

Объединение нескольких операторов символов может работать не всегда как оператор. например, если мы возьмем =и !, он будет работать как оператор, только если он в шаблоне !=или !==. Для этих символов может быть множество комбинаций, таких как !====и !==!т. Д. И т. Д. Комбинации операторов должны быть в уникальном формате , уникальном порядке , уникальных комбинациях (все символы не будут сочетаться со всеми остальными символами) и определенно без пробелов между ними .

Проверьте список операторов ниже;

введите описание изображения здесь

Альфред
источник
2
Я попал под ту же иллюзию возможности использовать <table>.
Чад Харрисон
+ почти думал, что это стол ... но на самом деле это изображение
Баба
38

==! это не оператор, а два:

== и !

! имеющий более высокий приоритет, чем ==

Так :

"a" !== " ": bool(true) -> правда, потому что "а" действительно не равно ""

"a" ==! " ": bool(false) -> ложь, потому что "а" не равно! ""

Может быть написано с пробелом между == и!

Майкл Лаффарг
источник
1
false because "a" is not equals to !" "! "" означает приведение к булу и отрицанию того, что "" верно и! "" ложно.
Zaffy
@quarry Да, я не слишком углубился в объяснение: p
Майкл Лаффарг,
29

==!не существует как таковой. Это несколько загадочная запись== !

Поскольку пробелы в этих операциях не имеют значения, вы могли бы так же легко написать a --> b, что оценивается a-- > b, но будет выглядеть странно.

Итак, что касается вопроса: "a" ==! " "будет разобрано до "a" == !" ". Отрицание строки покрыто литьем , что означает любую строку , но "0"и в " "том, когда отливает, true.

Таким образом, выражение "a" == !" "будет передано:

  1. "a" == !" "
  2. "a" == !false
  3. "a" == true

И, как string "a"не то же самое bool true, это оценивает все выражение в false.

Итак, какова мораль этой истории? Не позволяйте себе быть смущенным пропущенными или неправильно размещенными пробелами! :)

FP
источник
3
в отличие от указанного в этом ответе, «a» == true оценивается как true, поскольку непустая строка преобразуется в логическое значение true. Выражение "a" === true будет оцениваться как false.
Паскаль Розин
25

==! не оператор

==!вовсе не оператор сравнения php - он такой же, как == !(обратите внимание на пробел)

Т.е.

if ("a" !== " ") {
    // evaluates to true - "a" and " " are not equal
}

if ("a" == !" ") {
    // unreachable
} else {
    // evaluates to false - "a" is not equal to true (!" " evaluates to true)
}
AD7six
источник