Tabla de precedencia de operadores para el lenguaje de programación C
⏰ 4 minutos de lectura
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
Lundin
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.
(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:
@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?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
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
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