Tabla de precedencia de operadores para el lenguaje de programación C

4 minutos de lectura

avatar de usuario
Lundin

¿Cómo sería una tabla de precedencia de operadores correcta que enumera todos los operadores en el lenguaje C?

Hice búsquedas exhaustivas en la web y encontré muchas de estas tablas de precedencia. Por desgracia, no he encontrado uno solo que cumpla con estos requisitos:

  • Liza todos operadores en el lenguaje C como se define en ISO 9899:2011, sin mezclar ningún operador de C++.
  • Enumera los operadores en el completo y correcto orden de prioridad.

  • La precedencia de operadores en C se especifica por el orden en que aparecen los distintos grupos de operadores en el estándar (capítulo 6.5). Esta es una lectura tediosa, sería preferible una “tabla de precedencia” que resuma rápidamente todos los operadores, particularmente como referencia para programar discusiones sobre SO. Si pudiéramos hacer una publicación de este tipo y usarla como Preguntas frecuentes de C, sería genial.

    – Lundin

    28 de junio de 2013 a las 16:09

  • posible duplicado de precedencia entre el acceso a miembros desde un puntero y el lanzamiento

    – jxh

    28 de junio de 2013 a las 16:15

  • @Lundin: en realidad, la precedencia del operador está especificada en C por la gramática. El orden en que aparecen en la norma es informativo, no normativo.

    –Eric Postpischil

    28 de junio de 2013 a las 16:28


  • @Lundin: Eso es consistente con lo que escribí.

    –Eric Postpischil

    28 de junio de 2013 a las 16:33

  • Una tabla de precedencia de operadores tampoco tendría ningún texto explicativo.

    – jxh

    28 de junio de 2013 a las 16:35

avatar de usuario
Lundin

ingrese la descripción de la imagen aquí


Explicación

Prec. denota precedencia del operadordonde el grupo 1 tiene la precedencia más alta y el grupo 17 la más baja.

Asoc. denota asociatividad del operador, cuando sea aplicable. La asociatividad puede ser de izquierda a derecha o de derecha a izquierda.

Fuentes

Mi ambición con esta publicación es proporcionar una tabla de precedencia de operadores en el sitio en Stack Overflow, que es correcta y canónica. Esta tabla de precedencia de operadores corresponde directamente al capítulo 6.5 de la ISO 9899:2011, donde podemos leer (6.5/3):

La agrupación de operadores y operandos se indica mediante la sintaxis. 85)

Y luego como comentario, en la nota al pie informativa (no normativa):

85) La sintaxis especifica la precedencia de los operadores en la evaluación de una expresión, que es el mismo orden de las subcláusulas principales de esta subcláusula, la precedencia más alta primero. /–/

Dentro de cada subcláusula principal, los operadores tienen la misma precedencia. La asociatividad por la izquierda o por la derecha se indica en cada subcláusula mediante la sintaxis de las expresiones discutidas allí.

Todos los nombres de operadores formales de la tabla se toman del capítulo 6.5, donde dicho nombre se puede encontrar en el texto normativo. Se incluyeron nombres informales en los casos en que la comunidad de programadores pudiera estar más familiarizada con otro nombre que no sea el que figura en el estándar.

  • Esperaba convertir esta publicación en un formato wiki, pero no logré publicar una tabla de texto que otros puedan editar. Cualquier revisión o corrección es muy apreciada, por favor deje un comentario a continuación. Preferiblemente con referencia a la norma. Por ahora, la tabla existe en formato MS Excel de texto con pestañas en mi computadora. Puedo proporcionar el archivo, si algún asistente web pudiera publicar una versión HTML del mismo en SO. Si la tabla pudiera ser editada por todos, sería genial.

    – Lundin

    10 de junio de 2014 a las 12:08

Aquí:

http://basen.oru.se/c/operadores.html

(Yo añadí _Alinear, que creo que es el único operador nuevo en C11, a mi propia tabla y lo publiqué allí. ¿Quizás eso es hacer trampa? Los comentarios y sugerencias sobre cómo mejorar la mesa son bienvenidos).

  • Supongo que la primera () es un paréntesis regular? Entonces sería parte de la categoría “expresiones primarias” con mayor prioridad que el postfijo. O si es una llamada de función, debe permanecer donde está. A la categoría de sufijo le falta el operador literal compuesto.

    – Lundin

    1 de julio de 2013 a las 6:17

  • No, el primer par de paréntesis es el operador de llamada de función. Los paréntesis regulares para agrupar subexpresiones no son un operador, por lo que no están en la tabla. No creo que los literales compuestos impliquen un operador en absoluto, son solo parte de la sintaxis, pero necesito verificar eso.

    – Thomas Padrón-McCarthy

    1 de julio de 2013 a las 6:23

  • Acabo de verificar su tabla con el estándar y comenté lo que pude encontrar. Los literales compuestos se consideran operadores, C11 6.5.2.5.

    – Lundin

    1 de julio de 2013 a las 6:25

Este sitio tiene una tabla de precedencia bastante buena:

http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm

  • @Lundin No sabía que la precedencia del operador cambió en C11, y no lo creería sin pruebas. Entonces, ¿qué dices que cambiaron para que esta tabla no sea válida? Por cierto, siempre miro es.wikipedia.org/wiki/…

    – cmaster – reincorporar a monica

    28 de junio de 2013 a las 17:49

  • Creo que se agregaron algunos operadores nuevos en C11 (alignofpor ejemplo), así que creo que solo quiere saber cómo encajan con el resto de los operadores.

    – Drew McGowen

    28 de junio de 2013 a las 17:52

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad