Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 63 additions & 39 deletions language/operators/precedence.xml
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 80dfa568e602649eb13585bf59a7b6239eddaac3 Maintainer: PhilDaiguille Status: ready -->
<!-- EN-Revision: 3a94de0974207a5704bb9f04377a2ea2baf487ba Maintainer: PhilDaiguille Status: ready -->
<!-- Reviewed: no -->
<sect1 xml:id="language.operators.precedence">
<title>La prioridad de los operadores</title>
<titleabbrev>Prioridad de los operadores</titleabbrev>
<para>
La prioridad de los operadores especifica el orden en el que deben ser analizadas las valores.
La prioridad de los operadores especifica con qué fuerza une dos expresiones.
Por ejemplo, en la expresión <literal>1 + 5 * 3</literal>, el resultado es
<literal>16</literal> y no <literal>18</literal>, ya que la multiplicación ("*") tiene una prioridad superior a la suma ("+").
Las parentesis pueden ser utilizados para forzar la prioridad, si es necesario. Por ejemplo: <literal>(1 + 5) * 3</literal> dará
Los paréntesis pueden ser utilizados para forzar la prioridad, si es necesario. Por ejemplo: <literal>(1 + 5) * 3</literal> dará
<literal>18</literal>.
</para>
<para>
Cuando los operadores tienen una prioridad igual, su asociatividad decide la forma en que los operadores son agrupados. Por ejemplo,
"-" es una asociatividad por la izquierda, así <literal>1 - 2 - 3</literal> es agrupado de esta manera <literal>(1 - 2) - 3</literal> y será evaluado
a <literal>-4</literal>. Por otro lado, "=" es una asociatividad por la derecha, así, <literal>$a = $b = $c</literal> es agrupado de esta manera
"-" es asociativo por la izquierda, así <literal>1 - 2 - 3</literal> es agrupado de esta manera <literal>(1 - 2) - 3</literal> y será evaluado
a <literal>-4</literal>. Por otro lado, "=" es asociativo por la derecha, así, <literal>$a = $b = $c</literal> es agrupado de esta manera
<literal>$a = ($b = $c)</literal>.
</para>

Expand All @@ -27,13 +27,13 @@
</para>
<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 <literal>!!$a</literal> puede ser agrupado únicamente de la siguiente manera <literal>!(!$a)</literal>.
Los operadores unarios son prefijos o sufijos, por lo que esta noción no es aplicable. Por ejemplo <literal>!!$a</literal> puede ser agrupado únicamente de la siguiente manera <literal>!(!$a)</literal>.
</para>
<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.
El uso de paréntesis, 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.
</para>
<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).
La tabla siguiente enumera 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>
<title>Prioridad de los operadores</title>
<tgroup cols="2">
Expand Down Expand Up @@ -76,7 +76,7 @@
</entry>
<entry>
<link linkend="language.operators.arithmetic">aritmética</link> (unario <literal>+</literal> y <literal>-</literal>),
<link linkend="language.operators.increment">incremento/decremento</link>
<link linkend="language.operators.increment">incremento/decremento</link>,
<link linkend="language.operators.bitwise">a nivel de bits</link>,
<link linkend="language.types.typecasting">conversión de tipo</link>&listendand;
<link linkend="language.operators.errorcontrol">control de errores</link>
Expand Down Expand Up @@ -129,7 +129,7 @@
<literal>&gt;&gt;</literal>
</entry>
<entry>
<link linkend="language.operators.bitwise">bitwise</link>
<link linkend="language.operators.bitwise">a nivel de bits</link>
</entry>
</row>
<row>
Expand Down Expand Up @@ -176,21 +176,21 @@
<entry>izquierda</entry>
<entry><literal>&amp;</literal></entry>
<entry>
<link linkend="language.operators.bitwise">bitwise</link>&listendand;
<link linkend="language.operators.bitwise">a nivel de bits</link>&listendand;
<link linkend="language.references">referencias</link></entry>
</row>
<row>
<entry>izquierda</entry>
<entry><literal>^</literal></entry>
<entry>
<link linkend="language.operators.bitwise">bitwise</link>
<link linkend="language.operators.bitwise">a nivel de bits</link>
</entry>
</row>
<row>
<entry>izquierda</entry>
<entry><literal>|</literal></entry>
<entry>
<link linkend="language.operators.bitwise">bitwise</link>
<link linkend="language.operators.bitwise">a nivel de bits</link>
</entry>
</row>
<row>
Expand Down Expand Up @@ -219,7 +219,7 @@
<entry><literal>? :</literal></entry>
<entry>
<link linkend="language.operators.comparison.ternary">ternario</link>
(izquierda--asociativo anterior a PHP 8.0.0)
(asociativo por la izquierda anterior a PHP 8.0.0)
</entry>
</row>
<row>
Expand Down Expand Up @@ -251,6 +251,13 @@
<link linkend="control-structures.yield.from">yield from</link>
</entry>
</row>
<row>
<entry>(n/a)</entry>
<entry><literal>=&gt;</literal></entry>
<entry>
<link linkend="language.generators.syntax">yield con claves</link>
</entry>
</row>
<row>
<entry>(n/a)</entry>
<entry><literal>yield</literal></entry>
Expand Down Expand Up @@ -284,6 +291,26 @@
<link linkend="language.operators.logical">lógico</link>
</entry>
</row>
<row>
<entry>(n/a)</entry>
<entry>
<literal>include</literal>
<literal>include_once</literal>
<literal>require</literal>
<literal>require_once</literal>
</entry>
<entry>
<function>include</function>,
<function>include_once</function>,
<function>require</function>&listendand;
<function>require_once</function>
</entry>
</row>
<row>
<entry>(n/a)</entry>
<entry><literal>fn (...) =&gt;</literal></entry>
<entry>desambiguación de las <link linkend="functions.arrow">funciones de flecha</link></entry>
</row>
<row>
<entry>(n/a)</entry>
<entry><literal>throw</literal></entry>
Expand Down Expand Up @@ -311,10 +338,9 @@
<example>
<title>Asociatividad</title>
<programlisting role="php">
<![CDATA[
<![CDATA[
<?php
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
// La asociatividad de los operadores ternarios difiere de C/C++
var_dump($a);

$a = 1;
Expand All @@ -327,7 +353,7 @@ var_dump($a, $b);
</example>
</para>
<para>
El operador ternario requiere específicamente el uso de parentesis para levantar la ambigüedad de la prioridad.
El operador ternario requiere específicamente el uso de paréntesis para eliminar la ambigüedad de la prioridad.
</para>
<para>
<example>
Expand All @@ -350,7 +376,7 @@ var_dump($a);
<example>
<title>Orden de evaluación indefinido</title>
<programlisting role="php" annotations="non-interactive">
<![CDATA[
<![CDATA[
<?php
$a = 1;
echo $a + $a++; // puede mostrar 2 o 3
Expand All @@ -367,18 +393,17 @@ $array[$i] = $i++; // puede definir el índice 1 o 2
<![CDATA[
<?php
$x = 4;
// Esta línea puede causar una salida inesperada:
echo "x menos uno es igual a " . $x-1 . ", en todo caso espero\n";

// Esta línea puede causar una salida inesperada :
echo "x menos uno es igual a" . $x-1 . ", en todo caso espero\n";

// la precedencia deseada puede ser reforzada utilizando parentesis. :
echo "x menos uno es igual a" . ($x-1) . ", en todo caso espero\n";
// la precedencia deseada puede ser forzada utilizando paréntesis:
echo "x menos uno es igual a " . ($x-1) . ", en todo caso espero\n";

// Esto no está permitido, y levanta una TypeError :
echo ("x menos uno es igual a" . $x) - 1 . ", en todo caso espero\n";
// Esto no está permitido, y lanza un TypeError:
echo (("x menos uno es igual a " . $x) - 1) . ", en todo caso espero\n";
?>
]]>
</programlisting>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Expand All @@ -394,31 +419,30 @@ Fatal error: Uncaught TypeError: Unsupported operand types: string - int
<![CDATA[
<?php
$x = 4;
// Esta línea puede causar una salida inesperada :
echo "x menos uno es igual a" . $x-1 . ", en todo caso espero\n";
// Esta línea puede causar una salida inesperada:
echo "x menos uno es igual a " . $x-1 . ", en todo caso espero\n";

// porque es evaluada como la línea siguiente (anterior a PHP 8.0.0) :
echo (("x menos uno es igual a" . $x) - 1) . ", en todo caso espero\n";

// la precedencia deseada puede ser reforzada utilizando parentesis. :
echo "x menos uno es igual a" . ($x-1) . ", en todo caso espero\n";
// porque es evaluada como la línea siguiente (anterior a PHP 8.0.0):
echo (("x menos uno es igual a " . $x) - 1) . ", en todo caso espero\n";

// la precedencia deseada puede ser forzada utilizando paréntesis:
echo "x menos uno es igual a " . ($x-1) . ", en todo caso espero\n";
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
<![CDATA[
-1, en todo caso espero
-1, en todo caso espero
x menos uno es igual 3, en todo caso espero
x menos uno es igual a 3, en todo caso espero
]]>
</screen>
</example>
</para>
<note>
<para>
Aunque <literal>=</literal> tiene prioridad sobre la mayoría de los operadores, PHP ejecutará expresiones como: <literal>if (!$a = foo())</literal>.
Aunque <literal>=</literal> tiene una prioridad inferior a la de la mayoría de los operadores, PHP permite de todos modos expresiones como: <literal>if (!$a = foo())</literal>.
En esta situación, el resultado de <literal>foo()</literal> será colocado en la variable <varname>$a</varname>.
</para>
<simpara>
Expand Down Expand Up @@ -460,16 +484,16 @@ x menos uno es igual 3, en todo caso espero
<entry>7.4.0</entry>
<entry>
Dependencia de la precedencia de la concatenación de strings
(<literal>.</literal>) relativo a la suma/resta aritmética
(<literal>.</literal>) relativa a la suma/resta aritmética
(<literal>+</literal> o <literal>-</literal>) o los desplazamientos bit a bit izquierda/derecha (<literal>&lt;&lt;</literal> o <literal>&gt;&gt;</literal>),
es decir, su uso conjunto en una expresión sin parentesis, está obsoleto.
es decir, su uso conjunto en una expresión sin paréntesis, está obsoleto.
</entry>
</row>
<row>
<entry>7.4.0</entry>
<entry>
Dependencia de la asociatividad por la izquierda del operador ternario (<literal>? :</literal>),
es decir, la imbricación de múltiples operadores ternarios que no están entre parentesis, está obsoleta.
es decir, la imbricación de múltiples operadores ternarios que no están entre paréntesis, está obsoleta.
</entry>
</row>
</tbody>
Expand Down