Precedencia de operadores y asociatividad en C

La precedencia de operadores determina qué operador se realiza primero en una expresión con más de un operador con diferente 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 el 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.
 

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente. 
 

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *