本贴转自:http://hi.baidu.com/froms/blog/item/4a8791dd44821d335882dd17.html
在C或C++中对于在for语句中的初始化部分声明的变量到底具有怎样的作用域,在“INTERNATIONAL STANDARD ISO/IEC 14882(ISO/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 statement(for语句)
……该贴原出处为: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
同样的问题发生在while、do … while、switch语句中。
但是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