2011-12-27 9 views
23

Perché questo codice non ++ C compilare sotto VS2010:Posso dichiarare variabili di tipi diversi nell'inizializzazione di un ciclo for?

for (int a = 0, short b = 0; a < 10; ++a, ++b) {} 

mentre questo si fa:

short b = 0; 
for (int a = 0; a < 10; ++a, ++b) {} 

è la dichiarazione di due variabili di tipo diverso all'interno del ciclo for inizializzatore proibiti? Se è così, come si può aggirare?

+0

Sembra tu dici. Usando lo stesso tipo funziona: 'for (int a = 0, b = 0; a <10; ++ a, ++ b) {}' Hmm. Mai notato prima. –

+0

Sì, questo è il meccanismo del "doppio ciclo" che proviene dal linguaggio C. Abbastanza raro, però. Non molto leggibile. – Raveline

risposta

40

Sì, è vietato. Altrimenti non è possibile dichiarare variabili di tipi diversi in una dichiarazione dichiarazione (modifica: modulo i modificatori dichiaratore menzionati da @MrLister). È possibile dichiarare le strutture

for (struct { int a = 0; short b = 0; } d; d.a < 10; ++d.a, ++d.b) {} 

C++ 03 Codice:

for (struct { int a; short b; } d = { 0, 0 }; d.a < 10; ++d.a, ++d.b) {} 

Naturalmente, quando tutti sono 0, è possibile omettere le inizializzatori del tutto e scrivere = { }.

+20

Odio il fatto che tu abbia condiviso questo. Scommetto che passeremo l'anno prossimo a rispondere a sciocche variazioni sull'uso di questo. Quando in realtà non vogliamo mai più vederlo. –

+2

@Loki: Questa non era esattamente la prima volta che l'hasc 'for struct' appariva su SO. – fredoverflow

+0

@Fred http://stackoverflow.com/a/889001/34509 –

0

È possibile dichiarare un solo tipo per istruzione. Quindi il secondo codice è quello utilizzabile.

0

Non è possibile dichiarare una variabile nella condizione while dello for (il passo di comprobazione).

for (a = 0, short b = 0; a < 10; ++a, ++b) {} 

che non funziona.

10

Niente a che vedere con il ciclo for. Anche questo non viene compilato se si scrive int a = 0, short b = 0; al di fuori di qualsiasi ciclo.
Quindi la risposta è: è sempre vietato dichiarare due variabili di tipi diversi in una singola istruzione.

Edit: Oh, per il pedante, mi rendo conto che si può dichiarare un tipo di base e di un tipo di puntatore nella stessa istruzione, per esempio un int e un puntatore a int, così quelli sarebbero diverse tipologie, sì.
Hm, questo mi fa pensare. In un ambiente a 32 bit, un puntatore sarebbe 4 byte, proprio come un int, quindi potresti usare short a = 0, * b = 0; e quindi b per un int. Hm ...

1

Qual è proibito è la fine di una dichiarazione con una virgola come si fa in int a = 0, short ...

Se si desidera utilizzare questa notazione poi Bothe muss variabili hanno lo stesso tipo int i = 0, s = 0;

Problemi correlati