<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>PHP on cnDenis的笔记</title><link>https://blog.cndenis.com/tags/PHP.html</link><description>Recent content in PHP on cnDenis的笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 30 Oct 2013 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.cndenis.com/tags/PHP/index.xml" rel="self" type="application/rss+xml"/><item><title>雷人的PHP的运算符优先级</title><link>https://blog.cndenis.com/Web/2013/10/PHP%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7.html</link><pubDate>Wed, 30 Oct 2013 00:00:00 +0000</pubDate><guid>https://blog.cndenis.com/Web/2013/10/PHP%E7%9A%84%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7.html</guid><description>&lt;p&gt;PHP中的运算符优先级, 比较运算符高于位运算符, 赋值运算符高于部分逻辑运算符,
真是坑啊.&lt;/p&gt;
&lt;p&gt;比较运算符高于位运算符, 所以&lt;/p&gt;
&lt;p&gt;&lt;code&gt;$A == $B &amp;amp; $C&lt;/code&gt; 等价于 &lt;code&gt;($A == $B) &amp;amp; $C&lt;/code&gt; 而 &lt;strong&gt;不是先做&lt;code&gt;&amp;amp;&lt;/code&gt;再进行比较&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;赋值运算 &lt;code&gt;and&lt;/code&gt; &lt;code&gt;or&lt;/code&gt; &lt;code&gt;xor&lt;/code&gt; 高于逻辑运算, 但却低于 &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; 和 &lt;code&gt;||&lt;/code&gt;, 所以&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="nx"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 输出是 bool(true)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 输出是 bool(false)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上面那行居然是 &lt;strong&gt;先把 &lt;code&gt;true&lt;/code&gt; 赋给 &lt;code&gt;$a&lt;/code&gt;&lt;/strong&gt;, 然后再与后面的&lt;code&gt;false&lt;/code&gt;做逻辑与.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; 和 &lt;code&gt;and&lt;/code&gt; 居然还不等价, 雷死人了.&lt;/p&gt;
&lt;p&gt;以后还是要习惯多加括号了.&lt;/p&gt;
&lt;p&gt;完整的优先级列表可以参考
&lt;a class="link" href="http://php.net/manual/zh/language.operators.precedence.php" target="_blank" rel="noopener"
 &gt;官方手册&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;刚发现还有另外的坑, 这个优先级是有例外的:
&lt;a class="link" href="http://www.laruence.com/2010/07/26/1668.html" target="_blank" rel="noopener"
 &gt;PHP运算符优先级的一个例外&lt;/a&gt;.&lt;/p&gt;</description></item></channel></rss>