2012-06-29 24 views
12

Powiel możliwe:
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?Dlaczego C++ nie obsługuje wielu inicjalizatorów w pętli 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; 
} 

nie skompilować, ponieważ posiadał istnieją dwa deklaracja w pętli for bloku inicjatora.

Ale dlaczego?

+3

Taka jest składnia języka :) Nic techniczny uniemożliwiający projektanci języka ześlizgują się z oczekiwanej składni, ale z jednego lub drugiego powodu po prostu nie :( – dasblinkenlight

+2

Mam rozwiązanie i jest piękne: http://ideone.com/DqiGm –

+1

@BenjaminLindley: Myślę, że to jest brzydkie: P. Zobacz moją odpowiedź. – Nawaz

Odpowiedz

15

W gramatyce C++, różne typy danych są oddzielone ; (jeśli nie działają). W pętli for po znalezieniu ; znaczenie jest zmieniane. tj.

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

Innym powodem jest prawdopodobnie uniknięcie złożoności w już skomplikowanej gramatyce, ta funkcja jest niedozwolona.

Jeśli chcesz zadeklarować zmienne w for zakresu pętli, to zawsze można zasymulować tę sytuację:

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

Ponieważ składnia została już podjęta. W zmiennej deklaracji/definicji, oddzielając przecinkami dodaje nowe zmienne tego samego typu, a nie różnych typów. Że składnia jest dostępny w for pętli:

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

Jeśli ktoś pisze, "int i, d;", ​​to zrozumiałe jest, że zmienne muszą być tego samego typu (wewnątrz lub na zewnątrz pętli). Ale myślę, że asker argumentuje, że dlaczego 'int i, double d;' nie jest dozwolone przez gramatykę C++, przez dodanie nieco większej złożoności. – iammilind

+0

@iammilind: pierwszy blok pętli for jest deklaracją zmiennej.W tym kontekście przecinek ma znaczenie i dokładną semantykę, które są spójne ze wszystkimi innymi deklaracjami zmiennych. Oczywiście możesz umieścić specjalny przypadek we wszystkich konstrukcjach, nazwij to * listą deklaracji pętli for * i całkowicie przedefiniuj te same pojęcia dostępne dla deklaracji. Rezultatem byłby bardziej złożony zestaw reguł, które wspierałyby jego (prawdopodobnie rzadszy przypadek użycia). Musiałbym ponownie wpisać już złożony typ iteratora bez żadnej dodatkowej wartości rzeczywistej (nie umożliwia on żadnego nowego konstruktu –

+2

.. są proste rozwiązania, jeśli potrzebujesz wielu zmiennych o różnych typach, na początek, możesz zaproponować, że możesz zamknąć pętlę w zasięgu i zadeklarować wszystkie inne zmienne w tym zakresie.Możesz również uniknąć dodatkowego zakresu przy użyciu typów złożonych , jak 'std :: pair':' for (pair p (0, 0.0), p.pierwszy <10; ++ p.pierwszy, p.second + = 0.1) '... lub krotki dla wielu takich zmiennych. –

38

Jeśli chcesz int i double zarówno w inicjalizacji, a następnie jeden sposób, aby to zrobić jest zdefiniowanie anonimowy struct! Tak, można można również zdefiniować w pętli struct w pętli . Wydaje się być mniej znane cechą 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; 
} 

wyjściowa:

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 online: http://ideone.com/6hvmq

+5

+1 dla pięknego rozwiązania, nigdy o tym nie myślę, ale myślę, że anonimowe 'struct' jest rozszerzeniem g ++ Czy ta metoda jest dozwolona we wszystkich kompilatorach? – iammilind

+2

@iammilind: To nie jest rozszerzenie g ++.To jest Standard C++. – Nawaz

+0

I ' m zdezorientowany twoim drugim zdaniem czy kiedykolwiek masz wątpliwości, że możemy zdefiniować struktury? Nie wygląda na coś, co wymaga specjalnej afirmacji. Co również odnosi się do "również"? –