2010-02-26 14 views
19

¿Por qué es esto no válidamúltiple Contador problema Con el bucle For

for(int i = 0, int x = 0; some condition; ++i, ++x) 

y esto es

int i, x; 
for(i = 0, x = 0; some condition; ++i, ++x) 

Gracias

+0

posible duplicado de [¿Puedo declarar variables de diferentes tipos en la inicialización de un bucle?] (Http://stackoverflow.com/questions/8644707/can-i-declare-variables-of-different -types-in-the-initialization-of-a-for-loop) –

+0

@Mechanicalsnail: El presunto duplicado es más nuevo que esta pregunta. ¿Por qué cerrarías esto? – bitmask

+0

@bitmask: La otra pregunta tiene una explicación un poco más de lo que estamos tratando de hacer, y tiene más respuestas de votos arriba. Pero que cerrar es una decisión de juicio. –

Respuesta

7

versión correcta es

for (int i = 0, x = 0; some condition; ++i, ++x) 
30

esto funciona:

for(int i = 0, x = 0; some condition; ++i, ++x) 

es como una declaración de variables:

int i, j; // correct 
int i, int j; // wrong, must not repeat type 
+5

De hecho, es una declaración de variable. Para ser precisos, ambos son 'simple-declaration's – MSalters

3

Debido a que una declaración de variables (como int x) no es una expresión y el operador coma (,) sólo combina expresiones.

+0

Esto expone una triste limitación del bloque de inicialización for loop. , es decir, todas las variables inicializadas en el bloque de inicialización deben ser del mismo tipo. –

+0

Casi: 'for (int x, * y; ...' – MSalters

+0

¡Cuidado, el ',' en la declaración 'int x, y;' NO es el operador de coma! – fredoverflow

8

¿Por qué debería ser válido? Es una estructura sintácticamente sin sentido. ¿Qué estabas tratando de decir con eso?

La primera parte del encabezado for es una declaración. El

int i = 0, int x = 0 

no es una declaración válida. No se compilará en for por la misma razón por la que no se compilará en cualquier otro lugar en el programa

int i = 0, int x = 0; // Syntax error 

Cuando tenga que declarar dos objetos de tipo int en una declaración, lo hace de la siguiente manera

int i = 0, x = 0; // OK 

lo mismo se puede utilizar en for

for(int i = 0, x = 0; some condition; ++i, ++x) 

(Pero cuando tiene que declarar dos variables de tipos diferentes, no se puede hacer con una declaración y, por lo tanto, no se pueden declarar ambos en for al mismo tiempo. Al menos uno de ellos tendrá que ser declarada antes for)

3

Esto es legal:.

for(int i = 0, x = 0; condition; ++i, ++x); 

int x, int y no es una forma legal de la declaración de variables;

34

cuando se necesita para declarar dos variables de diferentes tipos, no se puede hacer por una declaración

Hackety piratear Hack:

for (struct {int i; char c;} loop = {0, 'a'}; loop.i < 26; ++loop.i, ++loop.c) 
{ 
    std::cout << loop.c << '\n'; 
} 

;-)

+5

¡Wow! Nunca escuché esto antes. – sharptooth

+8

+ 1 para "Hackety hackear hackear" –

+0

Eso parece un buen truco. ¿Comentarías algún detalle extraño? Si reemplazo el tipo de variable i con algo como std :: vector :: const_iterator, no se compilará. .. Parece un código sucio de todos modos para escribir una estructura temporal larga con dos iteradores en el ciclo for, pero tengo sed de comprensión. – wf34

0

Implementé este enfoque para calcular la diferencia diagonal. Aquí estoy calculando la suma de Antidiagonal.

for(int i=0,j=n-1; i<n,j>=0;i++,j--){ 
    sum_right += a[i][j]; 
    }