??作用域的疑问
#include <iostream>
using namespace std;
void main()
{
int arraysize;
int *array;
cout<<"Please input a number of array elements:\n";
cin>>arraysize;
if((array=new int[arraysize])==NULL)
{
cout<<"Can't allocate more memory,terminating.\n";
return;
}
for(int count=0;count<arraysize;count++) //count redefinition
{
array[count]=count*2;
}
for(int count=0;count<arraysize;count++) //error
{
cout<<array[count]<<" ";
}
cout<<endl;
delete[]array;
}
不是说for括号中的变量作用域到其后第一个“}”就结束了吗?
这里为什么会有冲突:count redefinition
沏好茶等您来……
问题点数:80、回复次数:12Top
1 楼zdk2116()回复于 2003-06-03 22:01:39 得分 5
是这样的,换一个变量把Top
2 楼minijazz(随性而发)回复于 2003-06-03 22:11:54 得分 0
只有换掉变量吗?
书上说可以啊,但在VC上通不过Top
3 楼yeyuboy(海绵)回复于 2003-06-03 22:13:01 得分 5
标准c++语法,认为这不算是重定义,但一些具体的c++编译器,并不照章办事,建议换一个编译器,如果你太不愿意换,你只好避开啦。Top
4 楼xorong(勤劳与智慧)回复于 2003-06-03 22:41:55 得分 5
对,不同编译器的语法检查不一样Top
5 楼micropentium6(小笨|曾经的美好)回复于 2003-06-03 22:46:50 得分 5
这的确不是重复定义,
你使用的肯定是VC6.0,因为只有这种编译器在这种情况下会报错!
不过好象VC7.0已经可以顺利编译你的代码了:)Top
6 楼hpho()回复于 2003-06-03 22:59:00 得分 30
在文件头部加
#define for if(1) for
就可以了Top
7 楼steedhorse(晨星)回复于 2003-06-03 23:01:21 得分 5
VC7真的可以了吗?呵呵,祝贺微软。Top
8 楼rainbow1332(彩虹)回复于 2003-06-03 23:28:30 得分 1
我也有同样的情况!!!!!!!!!!Top
9 楼minijazz(随性而发)回复于 2003-06-04 10:57:40 得分 0
#define for if(1) for
的确可以
能解释一下吗?Top
10 楼Solmyr_biti(Muxia)回复于 2003-06-04 11:09:26 得分 10
因为vc6.0在for的循环外边进行了count的定义。
如果使用了if(1),count的作用域保证在if里面
其实,c,c++的编程很依赖于编译器,很少考虑移植,你就按照vc6的要求做吧
当然,换7.0更好。Top
11 楼windbells(风铃)回复于 2003-06-04 12:29:38 得分 10
在C++早些版本中,如TC++3.0,允许for 语句头中声明的变量的作用域延伸至包含for的最小语句块,后来的ANSI C++标准规定,for语句头中声明的变量之作用域只在该for语句中,但有些编译器仍保留另一种意义的选择,如BORLAND C++5.0中,可以选择for中声明的作用域范围。在VC中,还延续了早期的选择。
如果想解决问题的话,一种是替换变量名,另一种方法是把语句块的整体作用域范围缩小,例如改为
#include <iostream>
using namespace std;
void main()
{
int arraysize;
int *array;
cout<<"Please input a number of array elements:\n";
cin>>arraysize;
if((array=new int[arraysize])==NULL)
{
cout<<"Can't allocate more memory,terminating.\n";
return;
}
{
for(int count=0;count<arraysize;count++) //count redefinition
{
array[count]=count*2;
}
}
for(int count=0;count<arraysize;count++) //error
{
cout<<array[count]<<" ";
}
cout<<endl;
delete[]array;
}
这样编译出来的二进制代码没有任何的不同,但是变量名又不会冲突
Top
12 楼shanweibing(小菜鸟)回复于 2003-06-04 12:49:54 得分 4
我也遇到过这个问题,我认为还是避开好了。Top




