Різниця між "! ==" та "==!" [зачинено]


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
давай ... що з нагородами? Я можу скласти ще десяток таких питань. І супроводжувати їх квазісерйозним аналізом. Це стандартна практика вправ підручника, ні. У ТА ми голосуємо за якість та інформацію, а не для розваги та розваг.
1212

51
@sehe Він отримує позитивне рішення, оскільки його визначення добре вивченого питання - він "ретельно шукав відповідь", "був конкретним", питання "стосується інших" і "на тему". ОП випробував речі і показав нам, що він намагався; такий тип питань, який цей сайт намагається сприяти
JRaymond

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 і навіть зрозумів, що "==!" буде читатися як два оператори "==" і "!". Це просто показує, який вплив може мати трохи макет на те, як ви щось читаєте.
StarNamer

2
@Bang Dao Гм, JavaScript? Він має === і! ==. Але ні ==!
пн

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" насправді не дорівнює ""

"a" ==! " ": bool(false) -> false, тому що "a" не дорівнює! "

Можна записати з пробілом між == та !.


1
false because "a" is not equals to !" "! "" означає кинути на bool і заперечувати, що так "" є істинним і! "" неправдивим.
Заффі

@quarry Так, я не надто заглиблювався в пояснення: p
Майкл Laffargue,

29

==!не існує як такого. Це дещо криптовалюта== !

Оскільки пробіли не мають значення в цих операціях, ви можете так само легко писати a --> b, що оцінює a-- > b, але виглядатиме дивно.

Отже, щодо питання: "a" ==! " "будемо розбиратися в "a" == !" ". Заперечення рядки покрито литтям , що означає будь-який рядок , але "0"і в " "тому, коли відливає, true.

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

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

І, як string "a"це не те саме bool true, це оцінює весь вираз до false.

Отже, яка мораль історії? Не дозволяйте себе бентежити відсутніми або неправильно розміщеними пробілами! :)


3
на відміну від зазначеного у цій відповіді, "a" == true відповідає оцінці "true", оскільки не порожня рядок передається на булеве значення true. Вираз "a" === true оцінюється як хибне.
Паскаль Розін

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)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.