2012-06-29 15 views
12

Eventuali duplicati:
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?Perché C++ non supporta più inizializzatori nel ciclo for?

#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; 
} 

non compila, becuase ci sono due dichiarazione nel blocco inizializzatore for-loop.

ma perché?

+3

Tale è la sintassi del linguaggio :) Non c'è niente di tecnico che impediva i progettisti della lingua di scivolare nella sintassi che ci si aspetta, ma per un motivo o per l'altro hanno semplicemente non :( – dasblinkenlight

+2

ho la soluzione, ed è bellissimo: http://ideone.com/DqiGm –

+1

@BenjaminLindley: Penso che sia brutto: P. Vedi la mia risposta. – Nawaz

risposta

15

In grammatica C++, diversi tipi di dati sono separati con ; (se non funzione). Nel ciclo for, una volta trovato il valore ;, il significato viene modificato. Ad esempio

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

Un'altra ragione è forse quella di evitare la complessità in una grammatica già complessa, questa funzione non è consentita.

Se si vuole dichiarare le variabili in ambito for ciclo, allora si può sempre simulare questa situazione:

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

Poiché la sintassi era già stata presa. In una dichiarazione/definizione di variabile, la separazione con le virgole aggiunge nuove variabili dello stesso tipo, non di tipi diversi. Che la sintassi è disponibile in for loop:

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

Se qualcuno scrive 'INT E, d,' allora si capisce che le variabili devono essere dello stesso tipo (all'interno o all'esterno del ciclo). Ma, penso che il richiedente stia discutendo sul fatto che "int i, double d;" non sia permesso dalla grammatica C++, aggiungendo un po 'più di complessità. – iammilind

+0

@iammilind: il primo blocco del ciclo for è una dichiarazione di variabile.In quel contesto, la virgola ha già un significato e una semantica esatta che sono coerenti con tutte le altre dichiarazioni variabili. Naturalmente puoi costruire tutti i costrutti caso speciale, chiamalo * una lista-dichiarazione-ciclo * * e ridefinisci completamente gli stessi concetti disponibili per una dichiarazione. Il risultato sarebbe un insieme di regole più complesso in cui supportare il suo (probabilmente meno frequente caso d'uso) dovrei ridigitare il tipo già complesso dell'iteratore senza alcun valore reale extra (non abilita alcun nuovo costrutto –

+2

.. Esistono semplici soluzioni alternative se sono necessarie più variabili di tipi diversi definiti.Per i principianti, come proposto, è possibile racchiudere il ciclo in un ambito e dichiarare tutte le altre variabili in tale ambito. È inoltre possibile evitare l'ambito extra utilizzando i tipi compositi , come 'std :: pair':' for (coppia p (0, 0.0); p.first <10; ++ p.first, p.second + = 0.1) '... o tuple per più variabili di questo tipo. –

38

Se si desidera int e double sia, nella inizializzazione, quindi un modo per farlo è quello di definire una struct anonima! Sì, è possibile definire struct nel ciclo for, pure. Sembra essere un meno conosciuto caratteristica del 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; 
} 

uscita:

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 

Demo in linea: http://ideone.com/6hvmq

+5

+1 per una bella soluzione, mai pensato a questo, ma penso che le 'struct' anonime sono l'estensione g ++. È consentito in tutti i compilatori? – iammilind

+2

@iammilind: Non è un'estensione g ++, è standard C++. – Nawaz

+0

I ' m confuso dalla tua seconda frase qui mai dubito che possiamo definire le strutture? Non sembra qualcosa che ha bisogno di affermazione speciale. Cosa significa anche "bene"? –