对Visual C++中for语句中初始化部分声明的变量的作用域存在的问题

来源:互联网 发布:国密算法sm1 编辑:程序博客网 时间:2024/05/29 10:23

 

本贴转自:http://hi.baidu.com/froms/blog/item/4a8791dd44821d335882dd17.html

 

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

原创粉丝点击