<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.operators.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'language.operators.precedence.php',
    1 => 'Prioridad de los operadores',
    2 => 'La prioridad de los operadores',
  ),
  'up' => 
  array (
    0 => 'language.operators.php',
    1 => 'Los operadores',
  ),
  'prev' => 
  array (
    0 => 'language.operators.php',
    1 => 'Los operadores',
  ),
  'next' => 
  array (
    0 => 'language.operators.arithmetic.php',
    1 => 'Aritm&eacute;tica',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'language/operators/precedence.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.operators.precedence" class="sect1">
 <h2 class="title">La prioridad de los operadores</h2>
 
 <p class="para">
  La prioridad de los operadores especifica el orden en el que deben ser analizadas las valores.
  Por ejemplo, en la expresión <code class="literal">1 + 5 * 3</code>, el resultado es
  <code class="literal">16</code> y no <code class="literal">18</code>, ya que la multiplicación (&quot;*&quot;) tiene una prioridad superior a la suma (&quot;+&quot;).
  Las parentesis pueden ser utilizados para forzar la prioridad, si es necesario. Por ejemplo: <code class="literal">(1 + 5) * 3</code> dará
  <code class="literal">18</code>.
 </p>
 <p class="para">
  Cuando los operadores tienen una prioridad igual, su asociatividad decide la forma en que los operadores son agrupados. Por ejemplo,
  &quot;-&quot; es una asociatividad por la izquierda, así <code class="literal">1 - 2 - 3</code> es agrupado de esta manera <code class="literal">(1 - 2) - 3</code> y será evaluado
  a <code class="literal">-4</code>. Por otro lado, &quot;=&quot; es una asociatividad por la derecha, así, <code class="literal">$a = $b = $c</code> es agrupado de esta manera
  <code class="literal">$a = ($b = $c)</code>.
 </p>

 <p class="para">
  Los operadores, cuya prioridad es igual, que no son asociativos, no pueden ser utilizados entre ellos, por ejemplo,
  <code class="literal">1 &lt; 2 &gt; 1</code> está prohibido en PHP. La expresión
  <code class="literal">1 &lt;= 1 == 1</code> por el contrario, está permitida, ya que el operador
  <code class="literal">==</code> tiene una precedencia inferior al operador
  <code class="literal">&lt;=</code>.
 </p>
 <p class="para">
  La asociatividad tiene sentido únicamente para los operadores binarios (y ternarios).
  Los operadores unitarios son prefijos o sufijos, por lo que esta noción no es aplicable. Por ejemplo <code class="literal">!!$a</code> puede ser agrupado únicamente de la siguiente manera <code class="literal">!(!$a)</code>.
 </p>
 <p class="para">
  El uso de parentesis, incluso cuando no son necesarios, permite mejorar la legibilidad del código realizando agrupamientos explícitos en lugar de imaginar la prioridad de los operadores y sus asociatividades.
 </p>
 <p class="para">
  La tabla siguiente lista los operadores por orden de prioridad, con la prioridad más alta en la parte superior. Los operadores en la misma línea tienen una prioridad equivalente (por lo tanto, la asociatividad decide el agrupamiento).
  <table class="doctable table">
   <caption><strong>Prioridad de los operadores</strong></caption>
   
    <thead>
     <tr>
      <th>Asociatividad</th>
      <th>Operadores</th>
      <th>Información adicional</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>(n/a)</td>
      <td>
       <code class="literal">clone</code>
       <code class="literal">new</code>
      </td>
      <td><a href="language.oop5.cloning.php" class="link">clone</a> y <a href="language.oop5.basic.php#language.oop5.basic.new" class="link">new</a></td>
     </tr>

     <tr>
      <td>derecha</td>
      <td><code class="literal">**</code></td>
      <td><a href="language.operators.arithmetic.php" class="link">aritmética</a></td>
     </tr>

     <tr>
      <td>(n/a)</td>
      <td>
       <code class="literal">+</code>
       <code class="literal">-</code>
       <code class="literal">++</code>
       <code class="literal">--</code>
       <code class="literal">~</code>
       <code class="literal">(int)</code>
       <code class="literal">(float)</code>
       <code class="literal">(string)</code>
       <code class="literal">(array)</code>
       <code class="literal">(object)</code>
       <code class="literal">(bool)</code>
       <code class="literal">@</code>
      </td>
      <td>
       <a href="language.operators.arithmetic.php" class="link">aritmética</a> (unario <code class="literal">+</code> y <code class="literal">-</code>),
       <a href="language.operators.increment.php" class="link">incremento/decremento</a>
       <a href="language.operators.bitwise.php" class="link">a nivel de bits</a>,
       <a href="language.types.type-juggling.php#language.types.typecasting" class="link">conversión de tipo</a> y
       <a href="language.operators.errorcontrol.php" class="link">control de errores</a>
      </td>
     </tr>

     <tr>
      <td>izquierda</td>
      <td><code class="literal">instanceof</code></td>
      <td>
       <a href="language.operators.type.php" class="link">tipo</a>
      </td>
     </tr>

     <tr>
      <td>(n/a)</td>
      <td><code class="literal">!</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">lógico</a>
      </td>
     </tr>

     <tr>
      <td>izquierda</td>
      <td>
       <code class="literal">*</code>
       <code class="literal">/</code>
       <code class="literal">%</code>
      </td>
      <td>
       <a href="language.operators.arithmetic.php" class="link">aritmética</a>
      </td>
     </tr>

     <tr>
      <td>izquierda</td>
      <td>
       <code class="literal">+</code>
       <code class="literal">-</code>
       <code class="literal">.</code>
      </td>
      <td>
       <a href="language.operators.arithmetic.php" class="link">aritmética</a>
       (binario <code class="literal">+</code> y <code class="literal">-</code>),
       <a href="language.operators.array.php" class="link">array</a> y
       <a href="language.operators.string.php" class="link">string</a>
       (<code class="literal">.</code> anterior a PHP 8.0.0)
      </td>
     </tr>

     <tr>
      <td>izquierda</td>
      <td>
       <code class="literal">&lt;&lt;</code>
       <code class="literal">&gt;&gt;</code>
      </td>
      <td>
       <a href="language.operators.bitwise.php" class="link">bitwise</a>
      </td>
     </tr>

     <tr>
      <td>izquierda</td>
      <td><code class="literal">.</code></td>
      <td>
       <a href="language.operators.string.php" class="link">string</a> (a partir de PHP 8.0.0)
      </td>
     </tr>

     <tr>
      <td>izquierda</td>
      <td><code class="literal">|&gt;</code></td>
      <td>
       <a href="language.operators.functional.php" class="link">pipe</a>
      </td>
     </tr>

     <tr>
      <td>no asociativo</td>
      <td>
       <code class="literal">&lt;</code>
       <code class="literal">&lt;=</code>
       <code class="literal">&gt;</code>
       <code class="literal">&gt;=</code>
      </td>
      <td>
       <a href="language.operators.comparison.php" class="link">comparación</a>
      </td>
     </tr>

     <tr>
      <td>no asociativo</td>
      <td>
       <code class="literal">==</code>
       <code class="literal">!=</code>
       <code class="literal">===</code>
       <code class="literal">!==</code>
       <code class="literal">&lt;&gt;</code>
       <code class="literal">&lt;=&gt;</code>
      </td>
      <td>
       <a href="language.operators.comparison.php" class="link">comparación</a>
      </td>
     </tr>

     <tr>
      <td>izquierda</td>
      <td><code class="literal">&amp;</code></td>
      <td>
       <a href="language.operators.bitwise.php" class="link">bitwise</a> y
       <a href="language.references.php" class="link">referencias</a></td>
     </tr>

     <tr>
      <td>izquierda</td>
      <td><code class="literal">^</code></td>
      <td>
       <a href="language.operators.bitwise.php" class="link">bitwise</a>
      </td>
     </tr>

     <tr>
      <td>izquierda</td>
      <td><code class="literal">|</code></td>
      <td>
       <a href="language.operators.bitwise.php" class="link">bitwise</a>
      </td>
     </tr>

     <tr>
      <td>izquierda</td>
      <td><code class="literal">&amp;&amp;</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">lógico</a>
      </td>
     </tr>

     <tr>
      <td>izquierda</td>
      <td><code class="literal">||</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">lógico</a>
      </td>
     </tr>

     <tr>
      <td>derecha</td>
      <td><code class="literal">??</code></td>
      <td>
       <a href="language.operators.comparison.php#language.operators.comparison.coalesce" class="link">coalescencia nula</a>
      </td>
     </tr>

     <tr>
      <td>no asociativo</td>
      <td><code class="literal">? :</code></td>
      <td>
       <a href="language.operators.comparison.php#language.operators.comparison.ternary" class="link">ternario</a>
       (izquierda--asociativo anterior a PHP 8.0.0)
      </td>
     </tr>

     <tr>
      <td>derecha</td>
      <td>
       <code class="literal">=</code>
       <code class="literal">+=</code>
       <code class="literal">-=</code>
       <code class="literal">*=</code>
       <code class="literal">**=</code>
       <code class="literal">/=</code>
       <code class="literal">.=</code>
       <code class="literal">%=</code>
       <code class="literal">&amp;=</code>
       <code class="literal">|=</code>
       <code class="literal">^=</code>
       <code class="literal">&lt;&lt;=</code>
       <code class="literal">&gt;&gt;=</code>
       <code class="literal">??=</code>
      </td>
      <td>
       <a href="language.operators.assignment.php" class="link">asignación</a>
      </td>
     </tr>

     <tr>
      <td>(n/a)</td>
      <td><code class="literal">yield from</code></td>
      <td>
       <a href="language.generators.syntax.php#control-structures.yield.from" class="link">yield from</a>
      </td>
     </tr>

     <tr>
      <td>(n/a)</td>
      <td><code class="literal">yield</code></td>
      <td>
       <a href="language.generators.syntax.php#control-structures.yield" class="link">yield</a>
      </td>
     </tr>

     <tr>
      <td>(n/a)</td>
      <td><code class="literal">print</code></td>
      <td><span class="function"><a href="function.print.php" class="function">print</a></span></td>
     </tr>

     <tr>
      <td>izquierda</td>
      <td><code class="literal">and</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">lógico</a>
      </td>
     </tr>

     <tr>
      <td>izquierda</td>
      <td><code class="literal">xor</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">lógico</a>
      </td>
     </tr>

     <tr>
      <td>izquierda</td>
      <td><code class="literal">or</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">lógico</a>
      </td>
     </tr>

     <tr>
      <td>(n/a)</td>
      <td><code class="literal">throw</code></td>
      <td>
       <a href="language.exceptions.php" class="link">throw</a>
      </td>
     </tr>

    </tbody>
   
  </table>

 </p>
 <p class="para">
  <div class="example" id="example-1">
   <p><strong>Ejemplo #1 Asociatividad</strong></p>
   <div class="example-contents">
    <div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">3 </span><span style="color: #007700">* </span><span style="color: #0000BB">3 </span><span style="color: #007700">% </span><span style="color: #0000BB">5</span><span style="color: #007700">; </span><span style="color: #FF8000">// (3 * 3) % 5 = 4<br />// La asociatividad de los operadores ternarios difiere de C/C++<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">$b </span><span style="color: #007700">+= </span><span style="color: #0000BB">3</span><span style="color: #007700">; </span><span style="color: #FF8000">// $a = ($b += 3) -&gt; $a = 5, $b = 5<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">, </span><span style="color: #0000BB">$b</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  El operador ternario requiere específicamente el uso de parentesis para levantar la ambigüedad de la prioridad.
 </p>
 <p class="para">
  <div class="example" id="example-2">
   <p><strong>Ejemplo #2 Precedencia explícita</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">true </span><span style="color: #007700">? </span><span style="color: #0000BB">0 </span><span style="color: #007700">: (</span><span style="color: #0000BB">true </span><span style="color: #007700">? </span><span style="color: #0000BB">1 </span><span style="color: #007700">: </span><span style="color: #0000BB">2</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$a</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Esto ya no está permitido a partir de PHP 8<br />// $a = true ? 0 : true ? 1 : 2;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  La prioridad y la asociatividad del operador determinan únicamente la forma en que las expresiones son agrupadas; no especifican el orden de la evaluación. PHP no especifica (de manera general) el orden en que una expresión es evaluada y el código que asume un orden específico de evaluación no debería existir, ya que el comportamiento puede cambiar entre las diferentes versiones de PHP o según el código circundante.
  <div class="example" id="example-3">
   <p><strong>Ejemplo #3 Orden de evaluación indefinido</strong></p>
   <div class="example-contents">
    <div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$a</span><span style="color: #007700">++; </span><span style="color: #FF8000">// puede mostrar 2 o 3<br /><br /></span><span style="color: #0000BB">$i </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">] = </span><span style="color: #0000BB">$i</span><span style="color: #007700">++; </span><span style="color: #FF8000">// puede definir el índice 1 o 2<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="example-4">
   <p><strong>Ejemplo #4 Precedencia de <code class="literal">+</code>, <code class="literal">-</code> y <code class="literal">.</code></strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$x </span><span style="color: #007700">= </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// Esta línea puede causar una salida inesperada :<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"x menos uno es igual a" </span><span style="color: #007700">. </span><span style="color: #0000BB">$x</span><span style="color: #007700">-</span><span style="color: #0000BB">1 </span><span style="color: #007700">. </span><span style="color: #DD0000">", en todo caso espero\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// la precedencia deseada puede ser reforzada utilizando parentesis. :<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"x menos uno es igual a" </span><span style="color: #007700">. (</span><span style="color: #0000BB">$x</span><span style="color: #007700">-</span><span style="color: #0000BB">1</span><span style="color: #007700">) . </span><span style="color: #DD0000">", en todo caso espero\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// Esto no está permitido, y levanta una TypeError :<br /></span><span style="color: #007700">echo (</span><span style="color: #DD0000">"x menos uno es igual a" </span><span style="color: #007700">. </span><span style="color: #0000BB">$x</span><span style="color: #007700">) - </span><span style="color: #0000BB">1 </span><span style="color: #007700">. </span><span style="color: #DD0000">", en todo caso espero\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

   <div class="example-contents"><p>El ejemplo anterior mostrará:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
-1, en todo caso espero
-1, en todo caso espero
Fatal error: Uncaught TypeError: Unsupported operand types: string - int
</pre></div>
   </div>
  </div>
  <div class="example" id="example-5">
   <p><strong>Ejemplo #5 Antes de PHP 8, <code class="literal">+</code>, <code class="literal">-</code> y <code class="literal">.</code> tenían la misma precedencia</strong></p>
   <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$x </span><span style="color: #007700">= </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// Esta línea puede causar una salida inesperada :<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"x menos uno es igual a" </span><span style="color: #007700">. </span><span style="color: #0000BB">$x</span><span style="color: #007700">-</span><span style="color: #0000BB">1 </span><span style="color: #007700">. </span><span style="color: #DD0000">", en todo caso espero\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// porque es evaluada como la línea siguiente (anterior a PHP 8.0.0) :<br /></span><span style="color: #007700">echo ((</span><span style="color: #DD0000">"x menos uno es igual a" </span><span style="color: #007700">. </span><span style="color: #0000BB">$x</span><span style="color: #007700">) - </span><span style="color: #0000BB">1</span><span style="color: #007700">) . </span><span style="color: #DD0000">", en todo caso espero\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// la precedencia deseada puede ser reforzada utilizando parentesis. :<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"x menos uno es igual a" </span><span style="color: #007700">. (</span><span style="color: #0000BB">$x</span><span style="color: #007700">-</span><span style="color: #0000BB">1</span><span style="color: #007700">) . </span><span style="color: #DD0000">", en todo caso espero\n"</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>El ejemplo anterior mostrará:</p></div>
   <div class="example-contents screen">
    <div class="annotation-interactive cdata"><pre>
-1, en todo caso espero
-1, en todo caso espero
x menos uno es igual 3, en todo caso espero
</pre></div>
   </div>
  </div>
 </p>
 <blockquote class="note"><p><strong class="note">Nota</strong>: 
  <p class="para">
   Aunque <code class="literal">=</code> tiene prioridad sobre la mayoría de los operadores, PHP ejecutará expresiones como: <code class="literal">if (!$a = foo())</code>.
   En esta situación, el resultado de <code class="literal">foo()</code> será colocado en la variable <var class="varname">$a</var>.
  </p>
 </p></blockquote>
 <div class="sect2">
  <h3 class="title">Historial de cambios</h3>
  <table class="doctable informaltable">
   
    <thead>
     <tr>
      <th>Versión</th>
      <th>Descripción</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>8.0.0</td>
      <td>
       La concatenación de strings (<code class="literal">.</code>) ahora tiene una precedencia más baja que la suma/resta aritmética
       (<code class="literal">+</code> y <code class="literal">-</code>) y los desplazamientos bit a bit izquierda/derecha (<code class="literal">&lt;&lt;</code> y <code class="literal">&gt;&gt;</code>);
       anteriormente, esto tenía la misma precedencia que <code class="literal">+</code> y <code class="literal">-</code>, y una precedencia más alta que <code class="literal">&lt;&lt;</code> y <code class="literal">&gt;&gt;</code>.
      </td>
     </tr>

     <tr>
      <td>8.0.0</td>
      <td>
       El operador ternario (<code class="literal">? :</code>) ahora es no asociativo; anteriormente, era asociativo por la izquierda.
      </td>
     </tr>

     <tr>
      <td>7.4.0</td>
      <td>
       Dependencia de la precedencia de la concatenación de strings
       (<code class="literal">.</code>) relativo a la suma/resta aritmética
       (<code class="literal">+</code> o <code class="literal">-</code>) o los desplazamientos bit a bit izquierda/derecha (<code class="literal">&lt;&lt;</code> o <code class="literal">&gt;&gt;</code>),
       es decir, su uso conjunto en una expresión sin parentesis, está obsoleto.
      </td>
     </tr>

     <tr>
      <td>7.4.0</td>
      <td>
       Dependencia de la asociatividad por la izquierda del operador ternario (<code class="literal">? :</code>),
       es decir, la imbricación de múltiples operadores ternarios que no están entre parentesis, está obsoleta.
      </td>
     </tr>

    </tbody>
   
  </table>

 </div>
</div><?php manual_footer($setup); ?>