La sección 6.6/3
, "Expresiones constantes", del estándar ISO C99 es la sección que necesita. Afirma:
Las expresiones constantes no contendrán asignación, incremento, decremento, la función de guardia, o comas operadores, excepto cuando están contenidas dentro de una subexpresión que no es evaluado.
En el documento de justificación de la norma ISO C99, hay un pequeño fragmento:
Un entero expresión constante debe incluir sólo los números conocibles en tiempo de traducción, y los operadores sin efectos secundarios.
Y, puesto que no hay ningún punto en el uso del operador coma en absoluto si no está confiando en los efectos secundarios, es inútil en una expresión constante.
Por eso, quiero decir que no hay absolutamente ninguna diferencia entre los dos segmentos de código:
while (10, 1) { ... }
while (1) { ... }
ya que el 10
en realidad no lo hacen nada. De hecho,
10;
es un perfectamente válido, aunque no es muy útil, sentencia en C, algo que la mayoría de las personas no comprenden hasta que llegan a conocer mejor el idioma.
Sin embargo, no es una diferencia entre estas dos afirmaciones:
while ( 10, 1) { ... }
while (x=10, 1) { ... }
Hay un efecto secundario en el último uso del operador coma que es para establecer la variable x
-10
.
En cuanto a por qué no les gustan los efectos secundarios en expresiones constantes, el objetivo de las expresiones constantes es que pueden evaluarse en tiempo de compilación sin requerir un entorno de ejecución: ISO hace una distinción entre traducción (tiempo de compilación) y entornos de ejecución (tiempo de ejecución).
La pista de por qué ISO decidió no requerir compiladores para proporcionar información de entorno de ejecución (que no sea la materia contenida en los archivos de cabecera como limits.h
) se puede encontrar un poco más tarde en el documento de justificación:
Sin embargo, mientras que las implementaciones ciertamente permiten producir exactamente el mismo resultado en entornos de traducción y ejecución, lo que exige que esto se considere una carga intolerable para muchos compiladores cruzados.
En otras palabras, ISO no quería que los fabricantes de compiladores cruzados tuvieran que cargar con un entorno de ejecución para cada objetivo posible.
Gracias Rossel. Ahora el texto tiene una mayor legibilidad. –
posible duplicado de [¿Qué hace el operador de coma \ ', \' hacer en C?] (Http://stackoverflow.com/questions/52550/what-does-the-comma-operator-do-in-c) –