En pocas palabras, la precedencia de operadores es cuando el lenguaje nos dice qué operación pasará primero y qué operación pasará después de acuerdo al operador. Por ejemplo:
<?php$operacion=1+5*3;
¿Primero suma y luego multiplica? O ¿Primero multiplica y luego suma?
La respuesta es: primero multiplica y luego suma, por lo que nuestra variable $resultado valdrá 16. Esto es debido a que la multiplicación tiene mayor precedencia que la suma.
La asociatividad
Cuando los operadores tienen la misma precedencia, su asociatividad elige si se resuelve la instrucción a partir de la derecha o desde la izquierda.
<?php// Tiene asociatividad de izquierda:echo1-2-3;
Observamos que se usa un mismo operador, por tanto, el nivel de precedencia va a ser igual. La asociatividad de “-” es de izquierda, en consecuencia, primero resolverá la resta 1 - 2 y luego restará 3.
<?phpecho1-2-3;/*
Veamos como serían los estados de la operación ayudándonos del uso de paréntesis:
echo 1 - 2 - 3;
echo (1 - 2) - 3;
echo -1 - 3;
echo (-1 - 3);
echo -4
*/
Ahora un ejemplo con asociatividad de derecha:
<?php$c=10;$a=$b=$c;echo$a;# 10echo “\n”;# Salto de línea/*
Primero la variable $b se iguala al valor de la variable $c y luego resultado se iguala a la variable $a:
$a = $b = $c
$a = ($b = $c)
$a = (10)
$a = 10
Finalmente, se imprime en pantalla el número 10, pues este es el valor de la variable $a.
*/
Tabla de precedencia y asociatividad en PHP
Observemos mediante una tabla la precedencia (los de más alta estarán al inicio) y asociatividad de los operadores en PHP:
Problemas con la precedencia
Hay ocasiones en la que la precedencia y asociatividad de los operadores nos puede jugar en contra provocando resultados no deseados. Por ejemplo, si en una evaluación AND una de las afirmaciones es falsa, el resultado será falso (false):
<?php$michis_4_patas=true;$michis_programan_con_PHP=false;$resultado=$michis_4_patasand$michis_programan_con_PHP;var_dump($resultado);# Imprimimos en pantalla el valor de la variable $resultadoecho “\n”;# Salto de línea# Mensaje en consola:# bool(true)
Sin embargo, si ejecutamos este código nos aparecerá en pantalla el valor de true. Esto es debido a que la asociatividad del operador and es de izquierda y hará que primero la variable $resultado se iguale al valor de $michis_4_patas el cual es true, por ello cuando queramos imprimirlo en consola nos dirá que el valor de $resultado es true:
<?php$michis_4_patas=true;$michis_programan_con_PHP=false;$resultado=$michis_4_patasand$michis_programan_con_PHP;/*
Usemos unos paréntesis para entender que fue lo que pasó:
($resultado = $michis_4_patas) and $michis_programan_con_PHP;
A la variable $resultado se le asignará el valor de la variable $michis_4_patas:
$resultado = true;
*/var_dump($resultado);# Se imprimirá true en pantallaecho “\n”;# Salto de línea
Forzando la evaluación
Una solución para los problemas que podemos tener con la precedencia y su asociatividad, es el uso de paréntesis en las operaciones que no queremos que se vean afectadas. Arreglemos el ejemplo anterior:
<?php$michis_4_patas=true;$michis_programan_con_PHP=false;$resultado=($michis_4_patasand$michis_programan_con_PHP);var_dump($resultado);# Imprimimos en pantalla el valor de la variable $resultadoecho “\n”;# Salto de línea# Mensaje en consola:# bool(false)
Los paréntesis forzarán a realizar la evaluación que este dentro. Por ello es que la variable $resultado ya no es igualado al valor de $michis_4_patas directamente, sino que tomará el resultado de la evaluación AND entre $michis_4_patas y $michis_programan_con_PHP y como uno de estas variables es falsa, el valor final será false.
No me da pena decir que llevo programando en PHP por 2 años, y estaba convencido de que eso daba false si o si, nunca me había dado false en el tiempo que llevo programando imagino por la costumbre de siempre colocar los paréntesis. Excelente clase.
siempre que uno estudia más cursos en PHP por mas básico que sea, siempre se aprende algo nuevo
yo por ejemplo...nunca habia escuchado del operador de nave espacial <=> ni el de fusión de null ??
Los paréntesis son mi pastor, entonces. Con ellos se soluciona todo
dios este man enseña muy bien
La Precedencia de Operadores nos sirve para decidir qué pasará?, en qué orden?, cuando estamos programando. Para que funcione primero incializamos la variable y luego le asignas la funcion que debe realizar, es decir, por ejemplo, primero le das le valor de cero a la variable y luego le dices que le sume 1 cada vez que haga un ciclo
exactamente :D podemos forzar al programa que haga lo que queremos de esa manera, ya sólo es echarle lógica a cómo podríamos solucionarlo según sea el caso.
Excelente aporte!👏😀
Una observación. La documentación de PHP es muy clara al respecto: primero se respeta la precedencia, después la asociatividad cuando la precedencia de los operadores está en el mismo nivel.
Por ejemplo, * tiene mayor precedencia que +, aún cuando ambas tienen asociatividad izquierda. De tal forma que algo como esto:
<?php
echo $res =5+2*3;
Dará como resultado 11, porque primero hace el producto (2 * 3) y después lo suma a 5.
Otro ejemplo es el de and y &&, en donde la operación "falla" si se le pone and pero será exitosa si se le coloca &&.
<?php
$gato_tiene_4_patas =true;$gato_programa_PHP =false;$resultado = $gato_tiene_4_patas and $gato_programa_PHP;echo 'Gato tiene 4 patas Y programa en PHP: ';var_export($resultado);echo "\n";$resultado = $gato_tiene_4_patas && $gato_programa_PHP;echo 'Gato tiene 4 patas && programa en PHP: ';var_export($resultado);echo "\n";
En términos prácticos, hay que tomar la tabla de precedencia de PHP primero de arriba hacia abajo y luego según su asociatividad.
Pensé que ya se te había olvidado que teníamos pendiente el ejemplo de por que daba true el and de ese ejemplo de los michis jaja
Bastante interesante este tema, muchas gracias por aclararlo
!toy
Pregunta
&& y and tienen la misma precedencia, entonces ¿por que si uso && en lugar de and dan valores distintos ?
// "&&" tiene una precedencia mayor que "and"// El resultado de la expresión (true && false) es asignado a $g// Actúa como: ($g = (true && false))$g =true&&false;// La constante true es asignada a $h antes de que suceda la operación "and"// Actúa como: (($h = true) and false)$h =true and false;
Fuente
también está por el hecho de que en la tabla de precedencia de PHP nos muestra que '&&' está en una posición mas alta que '=' y al final 'and'. Por esta razón && siempre resolverá la operación lógica y luego asignará '='. En cambio, al usar 'and' primero hará la asignación '=' y finalmente 'and'.
Quisiera que me explicaran de otra forma el ejemplo del operador and, porque no logro entender del todo aunque vea el video varias veces ya. El mismo ejemplo pero con otras palabras.
Entiendo que la variable $resultado perse está almacenando true, pero toda la instrucción es false.
En el siguiente código te explico:
$verdadero =true;$falso =false;// **** Primer caso$resultado = $verdadero and $falso;var_dump($resultado);// true// PHP asume $resultado = $verdadero;// precedencia izquierda//// **** Segundo caso$resultado =($verdadero and $falso);var_dump($resultado);// false// Con los paréntesis, PHP se obliga a resolverlos primero y luego asigna el resultado
Hola! me encuentro con la misma duda, entiendo que primero asigna y sale true, pero porque no sigue con la evaluación"ando" false ahí debería dar false😞 evaluación? si
Recientemente tuve problemas con una condicional al usar "and". No había tenido en cuenta la precedencia y que mi problema se resolvía encapsulado entre paréntesis =(.
Aca hay algo importante:
Aunque && y AND significan lo mismo, && tiene mayor precedencia que AND, incluso tiene mayor precedencia que "=".
si evaluamos por ejemplo:
$a=true;
$b=false;
$c=$a && $b;
var_dump($c)
imprime false.
Lo mismo pasa con el operadpr || y el OR
En resumen, para evitarme problemas de logica siempre trabajo con los operadores && y || porque tienen mayor precedencia que el "=" y de esta manera primero se resuelve la operación logica antes de la asignación.
La precedencia de operadores es una colección de reglas que definen cómo se ordenan las operaciones en una expresión que tiene más de un operador. Por ejemplo, en la expresión 3 + 4 * 5, primero se realiza la multiplicación y luego la suma, porque la multiplicación tiene mayor precedencia que la suma. Así, el resultado es 3 + (4 * 5) = 23 y no (3 + 4) * 5 = 35.
En PHP, la precedencia de operadores sigue un orden similar a la mayoría de los lenguajes de programación. Aquí te muestro una lista simplificada de operadores en orden de mayor a menor precedencia:
Operadores de incremento y decremento: ++, --
Operadores aritméticos: *, /, %
Operadores aritméticos de adición y sustracción: +, -
Operador de asignación: =, +=, -=, *=, /=, .= (concatenación)
Es importante recordar que puedes cambiar la precedencia de los operadores utilizando paréntesis. Por ejemplo, (3 + 4) * 5 cambiará la operación que se realiza primero.
También, algunos operadores tienen la misma precedencia y en estos casos se evalúan de izquierda a derecha. Por ejemplo, en la expresión 100 / 10 * 5, primero se realiza la división y luego la multiplicación, dando como resultado 50.
En pocas palabras y para evitarte de problemas con la precedencia, usar paréntesis cuando así se requiera.
Nunca había visto este concepto en profundidad. Aunque programo en Python, quizá nunca lo entendí o lo apliqué correctamente. Me parece excelente porque la explicación es clara y sencilla. Lo importante es no olvidar cómo aplicar esta lógica o, mejor aún, comprender su uso y los resultados que puede generar.
Hermano, que basura entonces el operador and xD. mejor sigo validando con mis operadores lógicos que traigo de JS: &&, ||, ??
Me gustaría compartir que dentro del video al realizar el contador cuando pones los signos a la derecha no hacen nada, sin embargo, si los cambias a la izquierda entonces si realiza el incremento (No se si esto tenga que ver con la precedencia del signo).
Como dijo algun companero en un aporte anterior, esa es la razon porque algunas personas odian php.
Y es porque no se siguen las reglas o no se entienden y se quieren cambiar, en este caso se trata de la sintaxis.
Y asociatividad derecha, PRIMERO SE INDICA CUAL NUMERO SE VA A INCREMENTAR.
La forma del operador incremento es esta:
$numero++
$numero= 6;
$numero++; // Equivale a la sentencia '$numero= $numero+ 1;'
gracias por tu comentario amiga
¿Por qué cuando el mismo código y sin utilizar los paréntesis lo escribo con && en lugar de and, me da false y con and me da true? gracias
en el caso de los michis la precedencia del and dice que se resolverán primero las operaciones de la izquierda, es decir la operación de asignación, pero si la operacion de asignación es la primera que aparece en la linea mucho antes que el operador logico and y la asignacion es de precedencia derecha por que se resuelve primero la asignación que el operador logico
la documentación dice lo siguiente
La siguiente tabla enumera los operadores en orden de precedencia, con los de más alta precedencia al inicio. Los operadores en la misma línea tienen igual precedencia, en cuyo caso la asociatividad decide el agrupamiento.
en la tabla se ve como el operador ++ tienen mayor precedencia que el operador de asignación = al estar mas arriba por lo cual debería ser la operación que se ejecute primero, tengo esa duda ahora no se en que estoy fallando
y para el caso de los gatitos el operador con mayor precedencia según la tabla es el de asignación y es por eso que da true por que primero se resuelve la asignación de
$resultado=$michis_4_patas;
y luego se haría
$resultado and $michis_programan_con_PHP;
el resultado seria false por que el valor de resultado es true y el de los michis_programas_con_PHP es falso.
si imprimen de esta manera lo pueden verificar
$michis_toman_agua =true;$michis_ladran =false;var_dump($resultado = $michis_toman_agua and $michis_ladran);//truevar_dump($resultado);//false
pueden notar que en $resultado su valor es true y que el resultado de toda la operacion aunque no quede almacenada es false
La precedencia es simplemente decidir qué viene primero y qué viene después, y la definimos en función de su asociatividad.
Es interesante esto, siempre pensé que and y && eran iguales, pero en la documentación justamente dicen que la diferencia está en la precedencia.
The reason for the two different variations of "and" and "or" operators is that they operate at different precedences. (See Operator Precedence.)