PHP中的运算符优先级错误(AND比较)


Operator precedence error in PHP (AND comparison)

在我的代码中,我有这样的比较:

$check_iter_C_sfavorito = ($tipo_iter_sfavorito[$id_loop][$k_tg] == 'C') AND (!(abs(@$delta_salto_check_sfavorito) < 0.001));

即使在

($tipo_iter_sfavorito[$id_loop][$k_tg] == 'C') ====>>>> is true

(!(abs(@$delta_salto_check_sfavorito) < 0.001)) ====>>>> is false

虽然如果我使用运算符"&&"而不是"AND"是可以的,但PHP运算符优先级意味着这不应该给出这个错误,因为括号!


感谢您对这两个"Mar*B*"的快速回答。我更改代码如下:

$check_iter_C_sfavorito = (($tipo_iter_sfavorito[$id_loop][$k_tg] == 'C') AND (!(abs(@$delta_salto_check_sfavorito) < 0.001)));

一切都好!

的等价物

($check_iter_C_sfavorito = ($tipo_iter_sfavorito[$id_loop][$k_tg] == 'C')) AND (!(abs(@$delta_salto_check_sfavorito) < 0.001));

因为AND的优先级低于赋值(=)

它在文档中直接指定:http://php.net/manual/en/language.operators.precedence.php

andor的绑定优先级低于=,因此您使用and的语句被视为

($foo = 'bar') AND 'baz';

请记住,在PHP中,赋值的结果就是被赋值的值。这就是标准的"数据库故障检查"代码的工作原理:

$result = mysql_query($sql) or die(msyql_error());

由于or的绑定低于=,因此该语句被解析为:

($result = mysql_query($sql)) or die(mysql_error());

如果DB查询失败,它将返回false,并将其分配给$result。该赋值的结果也是false,这将使用die cal获取or,从而导致脚本中止。如果查询成功,它将返回一个非false值(语句句柄),并且由于布尔短路,or永远不会启动。