La precedencia de operadores determina qué operador se realiza primero en una expresión con más de un operador con distinta precedencia.
Por ejemplo: Resolver
10 + 20 * 30
10 + 20 * 30 is calculated as 10 + (20 * 30) and not as (10 + 20) * 30
La asociatividad de operadores se utiliza cuando dos operadores de la misma precedencia aparecen en una expresión. La asociatividad puede serde izquierda a derechao de derecha aizquierda . Por ejemplo: ‘ *’ y ‘/’ tienen la misma precedencia y su asociatividad es deizquierda a derecha , por lo que la expresión “100 / 10 * 10” se trata como “(100 / 10) * 10”.
La precedencia y la asociatividad de los operadores son dos características de los operadores que determinan el orden de evaluación de las subexpresiones en ausencia de corchetes.
Por ejemplo: Resolver
100 + 200 / 10 - 3 * 10
1) La asociatividad solo se usa cuando hay dos o más operadores de la misma precedencia.
El punto a tener en cuenta es que la asociatividad no define el orden en que se evalúan los operandos de un solo operador. Por ejemplo, considere el siguiente programa, la asociatividad del operador + es de izquierda a derecha, pero eso no significa que siempre se llame a f1() antes que a f2(). De hecho, la salida del siguiente programa depende del compilador. Vea esto para más detalles.
C
// Associativity is not used in the below program. // Output is compiler dependent. #include <stdio.h> int x = 0; int f1() { x = 5; return x; } int f2() { x = 10; return x; } int main() { int p = f1() + f2(); printf("%d ", x); return 0; }
2) Todos los operadores con la misma precedencia tienen la misma asociatividad
Esto es necesario, de lo contrario, no habrá forma de que el compilador decida el orden de evaluación de las expresiones que tienen dos operadores de la misma precedencia y diferente asociatividad. Por ejemplo + y – tienen la misma asociatividad.
3) La precedencia y la asociatividad del sufijo ++ y el prefijo ++ son diferentes
La precedencia del sufijo ++ es más que el prefijo ++, su asociatividad también es diferente. La asociatividad del sufijo ++ es de izquierda a derecha y la asociatividad del prefijo ++ es de derecha a izquierda. Ver esto para ejemplos.
4) La coma tiene la menor precedencia entre todos los operadores y debe usarse con cuidado. Por ejemplo, considere el siguiente programa, el resultado es 1. Vea estoy esto para más detalles.
C
#include <stdio.h> int main() { int a; a = 1, 2, 3; // Evaluated as (a = 1), 2, 3 printf("%d", a); return 0; }
5) No hay enstringmiento de operadores de comparación en C
En Python, expresiones como «c > b > a» se tratan como «c > b y b > a», pero este tipo de enstringmiento no ocurre en C. Por ejemplo Considere el siguiente programa. La salida del siguiente programa es «FALSO».
C
#include <stdio.h> int main() { int a = 10, b = 20, c = 30; // (c > b > a) is treated as ((c > b) > a), associativity of '>' // is left to right. Therefore the value becomes ((30 > 20) > 10) // which becomes (1 > 10) if (c > b > a) printf("TRUE"); else printf("FALSE"); return 0; }
Consulte la siguiente tabla de precedencia y asociatividad como referencia.
Operador | Descripción |
Asociatividad
|
---|---|---|
( ) [ ] . -> ++ – – |
Paréntesis (llamada a función) (ver Nota 1) Corchetes (subíndice de array) Selección de miembros a través del nombre de objeto Selección de miembros a través de puntero Incremento/decremento de postfijo (ver Nota 2) |
de izquierda a derecha |
++ – – + – ! ~ ( tipo ) * & tamaño de |
Incremento/decremento de prefijo Más/menos unario Negación lógica/complemento bit a bit Convertir (convertir valor a valor temporal de tipo ) Dirección de desreferencia (del operando) Determinar el tamaño en bytes en esta implementación |
De derecha a izquierda |
* / % | Multiplicación/división/módulo | de izquierda a derecha |
+ – | Suma resta | de izquierda a derecha |
<< >> | Desplazamiento bit a bit a la izquierda, desplazamiento bit a bit a la derecha | de izquierda a derecha |
< <= > >= |
Relacional menor que/menor que o igual a Relacional mayor que/mayor que o igual a |
de izquierda a derecha |
== != | Relacional es igual a/no es igual a | de izquierda a derecha |
& | Y bit a bit | de izquierda a derecha |
^ | OR exclusivo bit a bit | de izquierda a derecha |
| | Bit a bit inclusivo O | de izquierda a derecha |
&& | Y lógico | de izquierda a derecha |
| | | O lógico | de izquierda a derecha |
? : | Condicional ternario | De derecha a izquierda |
= += -= *= /= %= &= ^= |= <<= >>= |
Asignación Asignación de suma/resta Asignación de multiplicación/división Asignación de módulo/Y bit a bit Asignación de OR exclusivo/inclusivo bit a bit Asignación de desplazamiento bit a bit a la izquierda/derecha |
De derecha a izquierda |
, | Coma (expresiones separadas) | de izquierda a derecha |
Es bueno conocer las reglas de precedencia y asociatividad, pero lo mejor es usar corchetes, especialmente para los operadores menos utilizados (operadores que no sean +, -, *..etc). Los corchetes aumentan la legibilidad del código ya que el lector no tiene que ver la tabla para averiguar el orden.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA