Разница между "!= = "и"==!" [закрытый]
вчера я наткнулся на это, когда я изменил PHP-код, написанный кем-то другим. Я был озадачен, что простое сравнение (if ($var ==! " ")
) не работает, как ожидалось. После некоторого тестирования я понял, что тот, кто написал этот код, использовал ==!
вместо !==
как оператор сравнения. Я никогда не видел ==!
на любом языке, поэтому я задался вопросом, как, черт возьми, этот код может даже работать и сделал некоторое тестирование:
<?php
echo "intn";
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 "booln";
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 "stringn";
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, но я подозреваю, что они пытаются интерпретировать его вместо поиска литеральной строки). Кто-нибудь видел это раньше и может пролить свет на такое поведение?
5 ответов
разница в том, что нет оператора ==!
.
Это выражение:
$a ==! $b
в основном то же самое, что и это:
$a == (!$b)
нет ==!
оператор в 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)
объединение нескольких символов операторов не всегда может работать как оператор. для пример, если взять =
и !
, он будет работать как операторы, только если он находится в шаблоне !=
или !==
. Для этих символов может быть множество комбинаций, таких как !====
, !==!
etc.. так далее.. Комбинации операторов должны быть в уникальный формат, уникальный, уникальные комбинации (все символы не будут сочетаться со всеми другими символами) и, безусловно,без какого-либо пространства между их!--29-->.
проверьте список операторов ниже;
==!
- Это не оператор, а два :
==
и !
!
имеют более высокий приоритет, чем ==
так :
"a" !== " ": bool(true)
--> true, потому что " a "на самом деле не равно" "
"a" ==! " ": bool(false)
--> false, потому что" a " не равно !""
может быть написано с пробелом между == и !.
==!
не существует как таковой. Это несколько загадочное обозначение == !
поскольку пробелы не имеют значения в этих операциях, вы можете так же легко написать a --> b
, который оценивает в a-- > b
, но будет выглядеть странно.
так, на вопрос: "a" ==! " "
будет проанализирован, чтобы "a" == !" "
. Отрицание строки покрывается литье, что означает любую строку, кроме "0"
и " "
, когда отливали, true
.
таким образом, выражение "a" == !" "
перечисляется:
"a" == !" "
"a" == !false
"a" == true
, а как string "a"
- это не то же самое как bool true
, это оценивает выражение false
.
Итак, какова мораль этой истории? Не позволяйте себе запутаться, пропуская или неправильно размещенные пространства! :)
==! не является оператором
==!
не является оператором сравнения 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)
}