downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | conferences | my php.net

search for in the

Operadores aritméticos> <Operadores
[edit] Last updated: Fri, 17 May 2013

view this page in

Precedencia de operadores

La precedencia de un operador indica qué tan "estrechamente" se unen dos expresiones juntas. Por ejemplo, en la expresión 1 + 5 * 3 , la respuesta es 16 y no 18 porque el operador de multiplicación ("*") tiene una precedencia mayor que el operador de adición ("+"). Los paréntesis pueden ser usados para forzar la precedencia, si es necesario. Por ejemplo: (1 + 5) * 3 se evalúa como 18.

Cuando los operadores tienen la misma precedencia, su asociatividad decide si se evalúan a partir de la derecha o desde la izquierda - ver más abajo los ejemplos.

La siguiente tabla lista en orden la precedencia de los operadores, con los operadores de mayor precedencia en la parte superior. Los operadores en la misma línea tienen la misma precedencia, en cuyo caso su asociatividad decide cuál es el orden de evaluación.

Precedencia de operadores
Asociatividad Operadores Información adicional
no asociativo clone new clone and new
izquierda [ array()
derecha ++ -- ~ (int) (float) (string) (array) (object) (bool) @ tipos e incremento/decremento
no asociativo instanceof tipos
derecha ! lógico
izquierda * / % aritmética
izquierda + - . aritmética y string
izquierda << >> bit a bit
no asociativo < <= > >= comparación
no asociativo == != === !== <> comparación
izquierda & bit a bit y referencias
izquierda ^ bit a bit
izquierda | bit a bit
izquierda && lógico
izquierda || lógico
izquierda ? : ternario
derecha = += -= *= /= .= %= &= |= ^= <<= >>= => asignación
izquierda and lógico
izquierda xor lógico
izquierda or lógico
izquierda , muchos usos

Para operadores de igual precedencia, asociatividad izquierda significa que la evaluación procede de la izquierda a la derecha y asociatividad derecha significa lo opuesto. Los operadores de igual precedencia que no son asociativos podrían no asociarse con sí mismos. Por ejemplo, la sentencia 1 < 2 > 1, es ilegal en PHP; mientras que la sentencia 1 <= 1 == 1 no lo es, ya que el operador T_IS_EQUAL tiene menos precedencia que el operador T_IS_SMALLER_OR_EQUAL.

Ejemplo #1 Asociatividad

<?php
$a 
5// (3 * 3) % 5 = 4
$a true true 2// (true ? 0 : true) ? 1 : 2 = 2

$a 1;
$b 2;
$a $b += 3// $a = ($b += 3) -> $a = 5, $b = 5

// mezclar ++ y + produce un comportamiento indefinido
$a 1;
echo ++
$a $a++; // puede mostrar 4 o 5
?>
El uso de paréntesis, incluso cuando no es estrictamente necesario, a menudo puede mejorar la legibilidad del código.

Nota:

Aunque = tiene una precedencia menor que la mayoría de los demás operadores, PHP permitirá aun expresiones similares a lo siguiente: if (!$a = foo()), en cuyo caso el valor devuelto de foo() es puesto en $a.



add a note add a note User Contributed Notes Precedencia de operadores - [2 notes]
up
5
Carsten Milkau
10 months ago
Beware the unusual order of bit-wise operators and comparison operators, this has often lead to bugs in my experience. For instance:

<?php if ( $flags & MASK  == 1) do_something(); ?>

will not do what you might expect from other languages. Use

<?php if (($flags & MASK) == 1) do_something(); ?>

in PHP instead.
up
6
headden at karelia dot ru
3 years ago
Although example above already shows it, I'd like to explicitly state that ?: associativity DIFFERS from that of C++. I.e. convenient switch/case-like expressions of the form

$i==1 ? "one" :
$i==2 ? "two" :
$i==3 ? "three" :
"error";

will not work in PHP as expected

 
show source | credits | stats | sitemap | contact | advertising | mirror sites