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

来源:互联网 发布:软件文档的重要性 编辑:程序博客网 时间:2024/04/30 12:15
首先来看这样一个例子:
在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了
原创粉丝点击