2013-01-17 89 views
1

當我寫的東西是這樣的:範圍語法

int data[] = {10,44,56,78,8};  
int i = 0; 
for(int element : data) 
    ... 

for然後由編譯器在常規for翻譯?那for 只是一個語法糖嗎?

+0

你可以在你的問題上更清楚一點嗎?你的編譯器是否拒絕那個語法?如果是這樣,你使用的是哪種編譯器?如果GCC,您是否使用'-std = C++ 0x'標誌來啓用C++ 11功能? –

+0

是的,我可以。不,我的編譯器沒有拒絕這種語法。我只想知道這是否是由編譯器翻譯的。 – xdevel2000

+0

如果它被翻譯成傳統的語法,那又如何?無論編譯器如何內部表示命令的結構,您都不會看到翻譯,並且代碼將執行相同的操作。編譯器是否將新的for語句表示爲傳統格式的轉換或完全獨立的語句,有什麼不同? –

回答

7

該標準定義了基於範圍的for聲明等同於:

{ 
    auto && __range = range-init; 
    for (auto __begin = begin-expr, 
      __end = end-expr; 
     __begin != __end; 
     ++__begin) { 
    for-range-declaration = *__begin; 
    statement 
    } 
} 

在你的情況,range-init(data)begin-expr__rangeend-expr__range + 5for-range-declarationint elementstatement...。無論這種轉換實際上是由編譯器完成

{ 
    auto && __range = (data); 
    for (auto __begin = __range, 
      __end = __range + 5; 
     __begin != __end; 
     ++__begin) { 
    int element = *__begin; 
    ... 
    } 
} 

是一個實現細節:也就是說,如果我們替換了所有這些,你for循環相當於。你唯一能保證的是你的代碼將等同於上面的代碼。

+1

順便說一下,'auto a,b'等價於'auto a;自動b'或'(猜測類型)a,b'? – Spook

+1

好問題。每個聲明的變量都會推導出它的類型,所以它相當於'auto a;自動b;'。整個* decl-specifier_seq *被結轉,因此對於'const auto a,b;'它將等同於'const auto a; const auto b;'。 –

+0

很高興知道,謝謝 – Spook