8

总是$a == $b等价于$b == $a?

我认为在 JavaScript 中,由于强制转换,有一些奇怪的情况是不正确的。

我认为ide是正确的。我再问一个问题

4

5 回答 5

4

简而言之,是的。$a == $b将始终等价于$b == $a。有一些缺点,例如花车。当然,无论如何,您都不应该嵌套两个浮点数以求相等。

编辑
关于浮动:如果你有两个浮动并比较它们,它们在技术上应该是相同的。但是,看起来具有相同值的浮点值实际上并不需要相同。因此,如果$a是文字.69并且$b是计算的结果,它们很可能是不同的,但都显示相同的值。这就是为什么你永远不应该使用==.

如果您需要比较浮点值,您确实需要在特定情况下使用可接受的最小差异。像这样的东西可以用于比较浮点数(将我们可接受的最小差异设置为0.000001):

if(abs($a-$b) < 0.000001) {
  //Same
}

PHP: abs - 绝对值

于 2011-01-20T21:13:03.000 回答
3

我能看到的唯一不同的类型是:

$foo = 1;
$bar = 1;

($foo = $foo + $bar) == ($bar = $foo);

要知道为什么,看看它

A -> ($foo = $foo + $bar)
B -> ($bar = $foo);

如果A先运行,则结果为2且 的结果为B2,因此它们相等且测试为true.

如果B先运行,则结果为1, 的结果为B2,因此它们不相等,测试为false

但是对于任何单一类型的比较(WhereA是一个变量而不是一个表达式),它将始终是自反的。

所以在一般意义上,A == B并不总是 100% 保证等于B == A. 对于变量,它总是等价的。但对于涉及变量赋值或修改的复杂表达式,它可能不是。

于 2011-01-21T15:44:26.823 回答
2

取决于这两个电话之间发生了什么。否则,是的,它们是相同的。顺序没有区别。使用 2 等于==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

http://www.ideone.com/JLJWQ

编辑

澄清一下,您绝对不能在 $a 或 $b 中放入任何内容来在比较中获得不同的输出,只需将其放在运算符的另一侧即可。

$a="1234";
$b="1234";

echo $a==$b;
echo $b==$a;

对于任何 $a 或 $b 值,其输出无疑将始终为真或假。

于 2011-01-20T21:10:30.583 回答
2

http://php.net/manual/en/language.operators.comparison.php

如果您想在比较中考虑类型转换,可以使用不同的运算符。 ==在相等的值上评估为 true,但不比较数据类型。===当值和数据类型相等时评估为真。使用后者考虑类型转换,它通常会被忽略(例如:表示整数的字符串和正在比较的整数。)

条件中的逻辑顺序不应该有所不同。

于 2011-01-20T21:13:32.860 回答
1

我已经尝试了许多变体,但找不到一个案例,($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";

所以,我在这一点上放弃了。欢迎提出想法!

于 2011-01-20T22:14:38.143 回答