Является ли $a == $b
всегда эквивалентным $b == $a
?
Я думаю, что в JavaScript есть несколько странных случаев, когда это не так, из-за кастинга.
Я думаю, что идеал верен. Я задам еще один вопрос .
Зависит от того, что происходит между этими двумя вызовами. В противном случае да, те же. Порядок не имеет значения. Использование 2 equals ==
Строка из 1 и целое число 1 вернет true при сравнении. Тип игнорируется, сравнивается только значение. Так что не странность.
http://php.net/manual/en/language.operators.comparison.php
<? $a=(string) 1; $b=(int) 1; var_dump($a); var_dump($b); echo $a==$b;
Выходы: 1
РЕДАКТИРОВАТЬ
Чтобы уточнить, нет абсолютно ничего, что можно было бы поставить в $ a или $ b, чтобы получить другой результат при сравнении, просто положив его на другую сторону оператора.
$a="1234"; $b="1234"; echo $a==$b; echo $b==$a;
Результат этого для любых значений $ a или $ b всегда будет, без сомнения, истинным, или false false.
Короче говоря, да. $a == $b
всегда будет эквивалентом $b == $a
. Есть короткие предложения, такие как поплавки. Конечно, вы не должны вставлять два float для равенства в любом случае.
РЕДАКТИРОВАТЬ
Что касается поплавков: если у вас было два поплавка и их сравнение, они технически должны быть одинаковыми. Однако значения с плавающей запятой, которые, похоже, имеют одинаковое значение, не обязательно должны быть идентичными. Таким образом, если $a
является литералом .69
и $b
является результатом вычисления, они могут быть очень разными, но оба имеют одинаковое значение. Вот почему вы никогда не должны сравнивать значения с плавающей запятой, используя ==
.
Если вам нужно сравнить значения с плавающей запятой, вам действительно нужно использовать наименьшую допустимую разницу в вашем конкретном случае. Что-то вроде этого будет работать для сравнения поплавков (установка нашей наименьшей допустимой разницы в 0.000001
):
if(abs($a-$b) < 0.000001) { //Same }
PHP: abs – Абсолютная ценность
Единственный тип, который я мог видеть в другом, – это что-то вроде:
$foo = 1; $bar = 1; ($foo = $foo + $bar) == ($bar = $foo);
Чтобы понять, почему, посмотрите на это
A -> ($foo = $foo + $bar) B -> ($bar = $foo);
Если сначала выполняется A
, результат будет равен 2
а результат B
будет равен 2, поэтому они будут равны, и тест будет true
.
Если B
запускается первым, результат будет равен 1
, а результат B
будет равен 2, поэтому они не равны, и тест будет false
.
Но для любого сравнения одного типа (где A
– переменная, а не выражение) она всегда будет рефлексивной.
Поэтому в общем смысле A == B
не всегда гарантированно на 100% эквивалентен B == A
Для переменных он всегда будет эквивалентным. Но для сложных выражений, связанных с назначением или модификацией переменных, это может и не быть.
http://php.net/manual/en/language.operators.comparison.php
Существуют различные операторы, которые вы можете использовать, если хотите сравнить листинг типов при сравнении. ==
оценивает значение true при равном значении, но не сравнивает тип данных. ===
оценивается как true, когда значения равны, а также типы данных. Использование последнего рассматривает тип casting, где он обычно игнорируется (например: строка, представляющая целое число и сравниваемое целое число).
Порядок логики в условном выражении не должен иметь значения.
Я пробовал несколько вариантов и не могу найти случай, когда ($a == $b) !== ($b == $a)
но пока ничего не сработало:
<?php $a = 0; $b = "0"; echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; $a = 0; $b = NULL; echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; $a = 0; $b = false; echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; $a = false; $b = NULL; echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; $a = ""; $b = NULL; echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; $a = "NULL"; $b = NULL; echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; $a = 0.000000000000000000000000001; $b = 0; echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n"; $a = array(); $b = array(); echo (($a == $b) == ($b == $a)) ? "OK\n" : "FAIL\n";
Итак, сейчас я сдаюсь. Идеи приветствуются!