您的位置:首页 > 其它

变量作用域内的子作用域内被重新定义的思考

2011-12-31 10:01 253 查看
首先来看这样一个例子:

在VC6中:

#include "stdafx.h"

#include <iostream>

using namespace std;

int main(int argc, char* argv[])

{

//循环A

for ( int i=0; i<10; i++)

{

cout <<i <<"------" <<endl;

{

//循环B

for ( int i=0; i<5; i++)

{

cout <<i <<"######" <<endl;

}

//语句C

cout <<i <<"----------------" <<endl;

}

cout <<i <<"---------------------------------------------" <<endl;

}

return 0;

}

编译结果

--------------------Configuration: overi - Win32 Debug--------------------

Compiling...

StdAfx.cpp

Compiling...

overi.cpp

Linking...

overi.exe - 0 error(s), 0 warning(s)

输出结果:



由于VC6对c++标准的支持较差,导致循环B处定义的i在的作用域延伸到语句C处,因些语句C输出为5----------------

再看VS2008:

#include "stdafx.h"

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

//循环A

for ( int i=0; i<10; i++)

{

wcout <<i <<"------" <<endl;

{

//循环B

for ( int i=0; i<5; i++)

{

wcout <<i <<"######" <<endl;

}

//语句C

wcout <<i <<"----------------" <<endl;

}

wcout <<i <<"---------------------------------------------" <<endl;

}

}

编译结果

1>------ 已启动全部重新生成: 项目: overi, 配置: Debug Win32 ------

1>正在删除项目“overi”(配置“Debug|Win32”)的中间文件和输出文件

1>正在编译...

1>stdafx.cpp

1>正在编译...

1>overi.cpp

1>f:\workspace\for_vs2008\overi\overi\overi.cpp(18) : warning C4258: “i”: 忽略 For 循环中的定义;使用封闭范围中的定义

1> f:\workspace\for_vs2008\overi\overi\overi.cpp(14) : 忽略“i”的定义

1> f:\workspace\for_vs2008\overi\overi\overi.cpp(10) : 使用“i”的定义

1>正在编译资源清单...

1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1

1>Copyright (C) Microsoft Corporation. All rights reserved.

1>正在链接...

1>LINK : 没有找到 F:\workspace\for_vs2008\overi\Debug\overi.exe 或上一个增量链接没有生成它;正在执行完全链接

1>正在嵌入清单...

1>Microsoft (R) Windows (R) Resource Compiler Version 6.1.6723.1

1>Copyright (C) Microsoft Corporation. All rights reserved.

1>生成日志保存在“file://f:\workspace\for_vs2008\overi\overi\Debug\BuildLog.htm”

1>overi - 0 个错误,1 个警告

========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========

输出结果:



由于VS2008显然对c++标准的支持好得多,循环B处定义的i在的作用域只在括号处便结束,因些语句C输出为4----------------

这表面上是小问题,可有时候会导致逻辑错误很难被查出。在嵌套循环时我们应该另外定义一个变量如:

for( int i=0; i<10; i++)

{

for( int k=0; k<10; k++)

{

.....

}

}

这样就不会有问题。

一个只有10行的代码,相信大家都不会写出上面的bug代码,但如果函数有3000行,那就不好说了,解决的办法是对代码不断重构,

写短小的函数,一个函数只做一个简单的功能,将大函数划分成小函数,减少重复代码,这样就能减少出错的概率。

另外,从编译的结果可以看出,vs2008立刻对代码提出了警告,而vc6表示一切正常. 好的工具也能减小错误的发生,我们有充分的理由抛弃VC6了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐