1. 程式人生 > >對Visual C++中for語句中初始化部分宣告的變數的作用域存在的問題

對Visual C++中for語句中初始化部分宣告的變數的作用域存在的問題

CC++中對於在for語句中的初始化部分宣告的變數到底具有怎樣的作用域,在“INTERNATIONAL STANDARD ISO/IEC 14882ISO/IEC 14882國際標準)”中是這樣定義的:(注:ISO/IEC 14882國際標準的內容是Programming languages — C++,即C++語言標準,包括1998-09-01的第一版和2003-10-15的第二版)該貼原出處為:http://hi.baidu.com/froms

6.5.3 The for statementfor語句)

……該貼原出處為:http://hi.baidu.com/froms

3 If the for-init-statement is a declaration, the scope of the name(s) declared extends to the end of the forstatement.

(如果for語句的初始化部分是一個宣告語句,則這個變數的作用域為從其宣告開始到該for語句結束)該貼原出處為:http://hi.baidu.com/froms

[Example:

int i = 42;

int a[10];

for (int i = 0; i < 10; i++)該貼原出處為:http://hi.baidu.com/froms

a[i] = i;

int j = i; // j = 42

end example]該貼原出處為:http://hi.baidu.com/froms

……

對於以上給出的例子可以很明顯的說明for語句中在初始化部分宣告的變數的作用域:如果其作用域是從變數宣告開始到該for

語句所在的作用域的結束部分的話,那麼這個例子將會發生編譯錯誤,因為變數i被重複定義了;而如果按標準中所說的那樣是從其宣告開始到該for語句結束的話,那麼for迴圈開始時,例子開頭處宣告的i失去了作用域,for迴圈初始化部分宣告的i獲得作用域,當結束for迴圈後,在for中宣告的i應該為10,而由於其作用域的限制,此時i被銷燬,例子開頭處宣告的i被從新賦予作用域,於是就有了後面的j=42該貼原出處為:http://hi.baidu.com/froms

同樣的問題發生在whiledo … whileswitch語句中。

但是Microsoft Visual C++ 1.0卻早在1993年就已經誕生,比

1998年才頒佈的C++語言國際標準早了5年,儘管Microsoft一再推出新版本,同時在1998年推出Microsoft Visual C++ 6.0,但對於以上所描述的for語句中的初始化部分宣告的變數的作用域,Microsoft卻採用了不同於國際標準的做法,即是從變數宣告開始到該for語句所在的作用域的結束部分,以至於對以上例子,Visual C++竟會報出“error C2374: 'i' : redefinition; multiple initialization(變數i重定義)”的錯誤,實屬不該啊。該貼原出處為:http://hi.baidu.com/froms