2012-06-29 10 views
12

Duplicar posible:
In C++ why can't I write a for() loop like this: for(int i = 1, double i2 = 0;
Why is it so 'hard' to write a for-loop in C++ with 2 loop variables?¿Por qué C++ no admite varios inicializadores en for loop?

#include <iostream> 
using namespace std; 

int main() 
{ 
    for (int i = 0, double j = 3.0; i < 10; i++, j+=0.1) 
     cout << i << j << endl; 
    return 0; 
} 

no compila, becuase hay dos declaración en el bloque de inicialización de bucle.

¿Pero por qué?

+3

Tal es la sintaxis de la lengua :) No hay nada técnico que impidió los diseñadores del lenguaje no se deslizan en la sintaxis que espera, pero por una razón u otra simplemente no lo hicieron :( – dasblinkenlight

+2

Tengo la solución, y es hermosa: http://ideone.com/DqiGm –

+1

@BenjaminLindley: Creo que es feo: P. Ver mi respuesta – Nawaz

Respuesta

15

En gramática C++, tipos de datos diferentes están separados por ; (si no funciona). En el bucle for, una vez que se encuentra el ;, se cambia el significado. es decir,

for (<initializations>; <condition>; <next operation>) 

Otra razón es posiblemente para evitar la complejidad en una gramática ya compleja, no se permite esta función.

Si desea declarar variables en for alcance de bucle, entonces siempre se puede simular esta situación:

int main() 
{ 
    { 
    double j = 3.0; 
    for (int i = 0; i < 10; i++, j+=0.1) 
     cout << i << j << endl; 
    } 
    return 0; 
} 
8

Debido a la sintaxis ya fue tomada. En una declaración/definición de variable, la separación con comas agrega nuevas variables del mismo tipo, no de diferentes tipos. Que la sintaxis está disponible en for bucles:

for (std::vector<int>::const_iterator it = v.begin(), end = v.end(); 
     it != end; ++it) { 
    // do something here 
} 
+0

Si alguien escribe, 'int i, d;', entonces se entiende que las variables deben ser del mismo tipo (dentro o fuera del ciclo). Pero, creo que asker está argumentando que 'int i, double d;' no está permitido por la gramática de C++, agregando algo más de complejidad. – iammilind

+0

@iammilind: el primer bloque del bucle for es una declaración de variable.En ese contexto, la coma ya tiene un significado y una semántica exacta que son consistentes con todas las demás declaraciones de variables. Por supuesto, puede hacer un caso especial de todas las construcciones, llamar a esto a * for-loop-declaration-list * y redefinir por completo los mismos conceptos disponibles para una declaración. El resultado sería un conjunto más complejo de reglas en el que para mantener a su (caso de uso menos frecuente podría decirse) Me gustaría tener que volver a escribir la ya compleja tipo de iterador para ningún valor real extra (que no permite ninguna nueva construcción –

+2

.. . hay soluciones simples si necesita varias variables de diferentes tipos definidos. Para empezar, como usted propuso, se puede encerrar el bucle en un ámbito y declarar todas las demás variables en ese ámbito. también puede evitar el alcance adicional mediante el uso de tipos compuestos , como 'std :: pair':' para (par p (0, 0,0); p.first <10; ++ p.first, p.second + = 0,1) '... o tuplas para múltiples tales variables. . –

38

Si quieren int y double tanto, en la inicialización, a continuación, una manera de hacer esto es definir una estructura anónima! Sí, usted puede definir struct en el lazo for, también. Parece ser un menos conocida característica de C++:

#include <iostream> 

int main() 
{ 
    for(struct {int i; double j;} v = {0, 3.0}; v.i < 10; v.i++, v.j+=0.1) 
     std::cout << v.i << "," << v.j << std::endl; 
} 

Salida:

0,3 
1,3.1 
2,3.2 
3,3.3 
4,3.4 
5,3.5 
6,3.6 
7,3.7 
8,3.8 
9,3.9 

demostración en línea: http://ideone.com/6hvmq

+5

1 de solución hermosa, nunca había pensado en esto, pero yo creo, 'struct' anónimos son g ++ extensión es de esta manera se permite en todos los compiladores – iammilind

+2

@iammilind:.? no es g ++ extensión es estándar de C++ – Nawaz

+0

I'.. Estoy confundido por tu segunda oración. Fue t ¿Alguna vez dudamos de que podamos definir las estructuras? No parece ser algo que necesita una afirmación especial. ¿A qué se refiere "también"? –