2009-11-15 20 views
15

¿Por qué la expresión especificada dentro de un operador de coma (como el ejemplo siguiente) no se considera una expresión constante?operador de coma C

Por ejemplo,

int a = (10,20) ; 

cuando se administra en el ámbito global produce un error "inicializador no es una constante", aunque tanto las expresiones separadas por un operador de coma son constantes (expresiones constantes). ¿Por qué la expresión completa no se trata como una expresión constante? Para aclarar, he leído What does the ‘,’ operator do in C? y Uses of C comma operator. No han tratado este aspecto del operador de coma.

+0

Gracias Rossel. Ahora el texto tiene una mayor legibilidad. –

+0

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) –

Respuesta

33

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.

+5

+1: Estaba buscando esto. Creo que la razón más profunda es que el operador de coma introduce un punto de secuencia. –

+0

Gracias paxdiablo. La referencia al documento de justificación es lo que solicité para aclarar mi duda. –

-2

gcс acepta esto:

int a = (10,20) ; 

int main() { 
    printf("%d\n",a); 
} 

y grabados 20. ¿Probablemente es un problema de tu compilador?

+0

Mi gcc (4.3.3), sin banderas, no lo acepta. –

+0

¿Qué versión de GCC en qué plataforma con qué banderas? Intenté con GCC 4.0.1 en MacOS X 10.5.8 sin banderas y obtuve el error. –

+0

gcc versión 3.4.4 (especial de cygming, gdc 0.12, con dmd 0.125) Cygwin, sin flags. –

6

ISO/IEC 9899: 1999 6.6/3 (Las expresiones constantes) afirma que las expresiones contant no deberán contener operadores comas (a menos que parte de un sub-expresión que no se evalúa), por lo (10,20) no es una expresión constante por definición .

La razón fundamental debe ser que, como el valor de la primera parte de la expresión de coma no se usa, solo está ahí para sus efectos secundarios y no tiene sentido que las expresiones constantes tengan efectos secundarios.

0

El compilador no lo considera una expresión constante ya que la variable es automática. Se permite evaluar en tiempo de ejecución y obtener un valor. Intenta hacer que la variable sea estática y verás el mismo mensaje de error ya que el compilador requerirá una expresión constante ese tiempo.