【问题标题】:Difference between "&&" and "and" : Operator precedence and short circuiting“&&”和“and”的区别:运算符优先级和短路
【发布时间】:2011-10-22 06:20:27
【问题描述】:

我正在浏览 php.net 的运算符优先级部分,遇到了this example,上面写着

$a = 1;
$b = null;
$c = isset($a) && isset($b);
$d = ( isset($a) and isset($b) );
$e = isset($a) and isset($b);
var_dump($a, $b, $c, $d, $e);
//Result:
int(1)
NULL
bool(false)
bool(false) <== I get this
bool(true)  <== I do not get this

我在代码中使用了大量的调试和冗长的 print(_r) 语句来跟踪我在代码中的位置。所以我在代码之间使用$debug and print_r($dataArray)$verbose and print "Updating dataArray\n" 作为单独的语句,允许我控制这些 print(_r) 语句。这来自我曾经写过很多 [[ $condition ]] &amp;&amp; { #Do if true } || { #Do if false } 的 BASH 经验。在 BASH 中,我知道它们是短路的,并利用这个事实编写了许多简单的单行。
现在我观察到很多这种做法(写作$verbose and print)正在慢慢蔓延到我的if 语句中。我知道这是不推荐的做法,可能会在咬我。但是,我确实想掌握这项技能,因为我喜欢写这样一个班轮,并希望将其用作我的个人风格

所以我的问题是:

  1. 哪个运算符(&amp;&amp;and)短路了?
  2. 手册说&amp;&amp; 优先于and,但有人可以通过将短路运算符特性/功能/特性与运算符优先级混合来举例说明这一点。 (基本上是优先级和短路的混搭)

请详细说明运算符的短路和返回值性质。

PS: 1. 希望这些运算符的关联性是一样的,直观的,但是如果你知道任何怪癖,请赐教。
PS:2.如果您仍然想警告我这种做法的危险,请举例说明。

编辑:通过将or 替换为|| 来更改我的简单$var = mysql_(...) or die() 代码后,我发现使用||&amp;&amp; 运算符而不是andor 是多么烦人. 代码根本不起作用!据我了解,前一个构造将TRUEFALSE 的返回值分配给$var,这反过来又使$var 的所有顺序使用产生警告/错误/意外行为。后一个构造首先将mysql_(...) 的结果分配给$var,然后评估=die 的复合。
这对我来说是一个很好的教训,我最好 1. 开始使用 PDO/mysqli 并自己处理错误 2. 在写我上面所说的作为个人风格的东西之前三思而后行。
//注意自己:不要在用另一种语言编写代码时使用一种脚本/解释性语言的经验,每一种都是独一无二的,都有自己的怪癖和陷阱,这只是可悲*叹气*

【问题讨论】:

  • @Gordon :感谢您的参考。我检查了列表,虽然有几个问题似乎回答了部分问题(比如我已经知道的优先级)。恕我直言,没有详细讨论运算符的短路性质及其优先级。
  • 示例链接上的评论作者提到了运算符优先级,这表明 AND 关键字在等号之后被评估。这看起来很奇怪,但它让我想起了一些脚本使用的 mysql_connect(...) or die() 行。
  • 确实!我每天都使用mysql_connect(...) or die()。我必须 1. 转移到 PDO,2. 始终使用 &amp;&amp;||。 @詹姆斯谢谢

标签: php operator-precedence short-circuiting


【解决方案1】:

代码

$e = isset($a) and isset($b);

解析方式与

相同
($e = isset($a)) and isset($b);

因此,由isset($a) 和分配确定的$etrue - 独立于评估isset($b)

【讨论】:

  • @Felix : 你能写/解释/详细说明 PHP 中的短路吗?我特别关心短路后产生的返回值。
  • @Sudhi:我不明白你想让我写什么。所有这些运算符(&amp;&amp;||andor)都是短路的……返回值始终是布尔值。
  • 如果 && 和 ||混合在同一个表达式中?是先计算 &&,还是严格从左到右计算?
猜你喜欢
  • 2015-08-04
  • 2010-12-03
  • 2023-01-31
  • 1970-01-01
  • 2011-06-21
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
相关资源
最近更新 更多