2010-10-03 17 views
5

A pesar del mal estilo, ¿es legal C tener un bucle for con llaves dentro de los parens? De esta manera:Es para ({declaraciones;}; condición; {declaraciones;}) legal C?

char *a = "a "; 
char *b = "b "; 

for ({ int aComesFirst = 1; 
     char *first = a; 
     char *second = b; 
     }; 
     aComesFirst >= 0; 
     { aComesFirst--; 
     swap(first, second); 
     }) 
{ 
    printf("%s%s\n", first, second); 
} 

Si algo en ese sentido es posible, se supone que voy a poner un punto y coma después de los primeros apoyos cercanos, o habría que añadir una línea vacía?

Me doy cuenta de que es estilísticamente mejor mover las declaraciones char* fuera del ciclo for y swap hasta el final del interior del ciclo. Pero el estilo no es el objetivo de esta pregunta, solo quiero saber si es posible poner llaves dentro de los parens.

+0

Puedo entender que esa cosa horrible compila en realidad? – naiad

+0

No, no es así. Eso es solo un ejemplo de la forma de respuesta que estoy buscando. – AlcubierreDrive

+0

relacionadas: http://stackoverflow.com/questions/3348766/how-to-initialize-several-variables-in-a-for-loop-in-c –

Respuesta

9

he respondido a esto antes ... esto puede ser fácilmente hecho social en C o C++ mediante la adición de un local de tipo struct. En general, es un estilo pobre.

char *a = "a "; 
char *b = "b "; 

for (struct loopy { 
     int aComesFirst; 
     char *first; 
     char *second; 
     } l = { 1, a, b }; /* define, initialize structure object */ 

     l.aComesFirst >= 0; /* loop condition */ 

     l.aComesFirst--, /* loop advance */ 
     swap(l.first, l.second) 
    ) 
{ 
    printf("%s%s\n", l.first, l.second); 
} 
+1

'struct loopy' ¡Ah! +1 encanta la etiqueta; -1 Arrrggghhhh; resultado +0 – pmg

+0

++ para hackear el lazo en funcionamiento real; la única respuesta directa a mi pregunta. Y sí, eso es tan elegante como el fondo de campana. – AlcubierreDrive

+0

Probablemente existan compiladores que le permitan omitir 'loopy' y' l' para declarar un objeto anónimo de tipo anónimo, para que pueda pretender que no existe. – Potatoswatter

6

No, no es legal, pero se puede usar comas para conseguir la mitad del camino:

for (int a = 1, b = 2; a < 10; ++a, ++b) 

No se puede declarar múltiples variables de diferentes tipos, y no se puede utilizar estructuras de control en el último poco, pero es lo suficientemente bueno la mayor parte del tiempo.

Si no lo sabía, la coma utilizarse no hay una sintaxis especial que sólo se puede utilizar en for bucles, es un general operator que se puede utilizar en cualquier lugar para evaluar el operando de la izquierda, seguido por el operando de la derecha, y devuelve el resultado de la expresión correcta, es decir, a, b == b y a, b, c == c y así sucesivamente.

+0

Gracias! Aceptaré tu respuesta en unos minutos si sigue siendo la mejor. – AlcubierreDrive

+0

... y, francamente, la estructura 'while 'equivalente será más clara de todos modos.Si está decidido a obtener un alcance limitado, simplemente use un bloque '{}' independiente alrededor del initialization-code-n-while-loop. – dmckee

3

No, no es legal. Si fuera legal, el código no funcionaría de todos modos porque c tiene un alcance de nivel de bloque, por lo que no tendría acceso a una de las variables definidas en los corchetes.

+2

Buen punto sobre el alcance del nivel de bloque. – AlcubierreDrive

2

Eso no es legal, pero esto es:

for(i = 0, j = 10; i < 10; i++, j--) 
{ 
    // .. 
} 

Ver: the comma operator

+0

++ para el enlace al "operador de coma". No sabía que la coma era un operador de primera clase y tan útil. – AlcubierreDrive

0

dice The Standard (6.8.5.3/1)

para (cláusula-1; expr-2; expr-3) Declaración

estoy bastante seguro de que ninguno expr-2 o expr-3 puede reemplazarse por algo que no sea una expresión (un bloque no es una expresión), y estoy seguro de que clause-1 tampoco se puede reemplazar por una instrucción.

+0

+1 para la citación pertinente y para contrarrestar a quien sea el imbécil de la votación negativa. –