2015-11-05 71 views
1

我知道這個循環的作品,我怎麼能在實際問題中使用它。但我想知道引擎蓋下發生了什麼。 我認爲該循環類似於常規的for循環中,例如C++ 11的範圍基於循環:它是如何真正發揮作用

for(int i = 0 ; i < 5 ; i ++){ 
// instructions 
} 

變量i只有一次初始化,所以我雖然,這是用於基於範圍循環相同。但是,如果我例如寫這樣的代碼:

for(const int x : vec) { 
cout << x << endl; 
} 

編譯器可以讓我做這件事,但我不明白這是怎麼可能的。如果變量x是常量,那麼在每次迭代中x值如何變化都是不同的。

+0

僅供參考它更接近'爲(自動ITER = vec.begin(!); ITER = vec.end(); ++ ITER)' – AndyG

回答

0

對於unsttanding目的,你可以認爲它好像編譯器正在用for (auto i = begin(y), end = end(y); i != end; ++i) { auto x = *i; {...} }替換for (auto x: y) {...}

性病::矢量begin(y)/end(y)將解析爲std:begin(y)將分別致電y.begin()/y.end()/std::end(y)版本。

+0

更多或更少。爲了理解它是完美的,但是你至少應該告訴句法的語法在現實中有點複雜 – bolov

+2

這不太準確。想象一下'y'是'make_temporary()'。 –

+1

@KerrekSB在這裏並不重要。 – leemes

0

範圍爲基礎的循環確實比經典for循環在這方面有所不同。您提供的聲明(const int x)針對聲明,每次迭代分別爲,與經典for循環相反。

爲了更精確:

for (const int x : vec) { 
    cout << x << endl; 
} 

僅僅是一個速記(和簡單地取代)下面的 「經典的迭代循環」:

for (auto it = vec.begin(), e = vec.end(); it != e; ++it) { 
    const int x = *it; 
    cout << x << endl; 
} 

(不同之處在於ite不在機身可用;也vec實際上是在一個獨立的變量「拯救」,但我們不要集中在這裏不重要的細節,確切的定義範圍爲基礎的循環可以擡頭here

注意const int x聲明並初始化爲*it循環體裏面!所以它在每個迭代初始化,而不是更改

相關問題