关于for(int i=0; i < 16; ++i)中的i;

daffyduck 2005-09-10 10:51:09
for(int i=0; i < 16; ++i)中i是全局的吗?
我在VC6.0中编译出现以下错误:
#include <iostream>
#include "world.h"

using std::cout;
using std::endl;

int main()
{
IStack stack;
for(int i=0; i < 16; ++i)
{
stack.Push(i);
}
for(int i=0; 1 < 16; ++i)
cout<< stack.Pop() <<endl;

return 0;
}

E:\VC学习\world\main.cpp(14) : error C2374: 'i' : redefinition; multiple initialization
E:\VC学习\world\main.cpp(10) : see declaration of 'i'
...全文
725 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
nasi00 2005-09-11
  • 打赏
  • 举报
回复
楼主的这种写法是标准C++中规定的,不过VC并不完全支持标准C++,可以改用gcc试试看...
wanguodu 2005-09-11
  • 打赏
  • 举报
回复
上文中,”任务“应为”认为“
wanguodu 2005-09-11
  • 打赏
  • 举报
回复
to qhfu(崩溃) :
我哪里说得有问题了?请斧正。但是别告诉我你不懂英文。
另,你得回答根本就是文不对题。即使for(int i=0; 1 < 16; ++i)写错了,编译器提示的也不会是"i重定义了"这个错误, 1<16编译器是不会认为是个错误的!如果是字母l<16的话,编译器应该提示l未定义才对!
最后,搂主的程序在我的VC6SP5上能编译通过。这应该是可以解释的,正如 jianlirong(简)所说,不同的编译器会有不同的结果。如果编译器认为for语句中的定义是局部于for到}之间的块的话,编译就能通过;反之,如果编译器任务for语句中的定义局部于for所在函数的话,编译器就会任务变量i重复定义了。记得在Tornado和g++中是有选项让用户来抉择这种情况的。
jianlirong 2005-09-11
  • 打赏
  • 举报
回复
这段时间我们都在学c++,楼长所说的,其实与c++的语法没多大的关系。在vc++6.0的编译器下,你的代码是通不过编译的。但在vc.net或Linux环境下的g++都可以通过编译。这是编译器的问题,没啥可说的。
qhfu 2005-09-11
  • 打赏
  • 举报
回复
楼上瞎说!
wanguodu 2005-09-11
  • 打赏
  • 举报
回复
两次定义了i, 只要把第二个for循环中的int i=0改为i=0就行了.
qhfu 2005-09-11
  • 打赏
  • 举报
回复
for(int i=0; i < 16; ++i)//这个i是局部的,只在for循环中有效。

for(int i=0; 1 < 16; ++i)//楼主这句话写错了。中间那个是l或者1 不是i,看清楚了!
yangyzqo 2005-09-11
  • 打赏
  • 举报
回复
这个与编译器有关,我也遇到过,楼主所说的为C++标准,并在dev_cpp上是可以通过的,但在vc++上好像是通过不了,我觉得这个程序对我的唯一影响就是,下次写程序时,要注意一点:那就是标准C++是标准C++,编译器是编译器,它们存在很大的联系,同时也有很多不同,我们应该发现这些不同,并注意它们对我们程序的影响。
  • 打赏
  • 举报
回复
用 VC6 , 加这两句在头上还是必要的:

#pragma warning( disable : 4786 )
#define for if(0) ; else for
yuanyou 2005-09-11
  • 打赏
  • 举报
回复
这种问题我碰到过很多次
每次在DEC C++下通过编译,到了VC却编译不过
这是编译器的问题
在VC下会被认为重复定义,但在DEC C++下是局部变量。
只因不标准的缘故
应该是局部变量的
dearlee_01 2005-09-11
  • 打赏
  • 举报
回复
i为局部变量,在main函数i变量定以后有效
int main()
{
IStack stack;
for(int i=0; i < 16; ++i)
{
stack.Push(i);
}
for(int i=0; 1 < 16; ++i)//////////////这个i重复定义了,因为上面已经定义了,可以直接使用
cout<< stack.Pop() <<endl;

return 0;
}
foochow 2005-09-11
  • 打赏
  • 举报
回复
呵呵,同意楼上的,VC6.0for(int i=0; i < 16; ++i)中i是全局的,你上面的代码重复定义了i
xiaocai0001 2005-09-11
  • 打赏
  • 举报
回复
标准上说,按楼主的写法,i的作用域只在for循环内起作用,但VC60编译器把i的生存域扩大到与for循环平级了,所以就会出现重新定义的错误。为了程序在各个编译器都能编译,最好还是在for循环外先定义一个循环变量,再使用,这样就不会出问题了。
smily2004 2005-09-11
  • 打赏
  • 举报
回复
以下是《C++ primer》第八章 域和生命期中的摘录:

局部域内的名字解析是这样进行的,首先查找使用该名字的域,如果找到一个声明则该名字被解析;如果没有找到则查找包含该域的域,这个过程会一直继续下去,直到找到一个声明或已经查找完整个全局域。如果后一种情况发生,即没有找到该名字的声明则这个名字的用法将被标记为错误。
因为在名字解析期间查找域的顺序由内向外,所以在外围域中的声明被嵌套域中的同名声明所隐藏。

有一些语句允许在它的控制结构中定义变量例如for 循环允许在它的初始化语句中定义一个变量
for ( int index = 0; index < vecSize; ++index )
{
// index 只在这里可见
if ( vec[ index ] == someValue )
break;
}
// 错误index 在这里不可见
if ( index != vecSize ) // 找到的元素

在for 循环的初始化语句中定义的变量如index 只在for 循环本身的局部域中及其中的嵌套局部域中可见(这是标准C++中的情况在标准C++之前并非如此)就好像for 语句是这样的

// 编译器转换后的表示
{ // 不可见的复合语句
int index = 0;
for ( ; index < vecSize; ++index )
{
// ...
}
}

这可以防止程序员在循环的局部域之外再次访问控制变量如果程序员希望通过测试index 来判断是否找到了这个值则代码段必须重写如下

int index = 0;
for ( ; index < vecSize; ++index )
{
// ...
}
// ok: index 在这里可见
if ( index != vecSize ) // 找到元素

因为在for 循环的初始化语句中声明的变量是局部于该循环的所以该变量可以在同局部域内的其他for 循环的控制结构中被再次使用例如

void fooBar( int *ia, int sz )
{
for (int i=0; i<sz; ++i) ... // ok
for (int i=0; i<sz; ++i) ... // ok: 不同的 i
for (int i=0; i<sz; ++i) ... // ok: 不同的 i
}


VC++ 6.0发布时,ISO-C++(98)似乎还没有出来。所以如果你是按照ISO-C++(98)做程序的话,应当升级你的编译器。

Bobby136 2005-09-11
  • 打赏
  • 举报
回复
for(int i=0;i<16;i++){
}
for(i=0;i<20;i++){
}

i不是在括号里面
后面的循环,i前面不需要加int

Java则不同
for(int i=0;i<16;i++){
}
for(int i=0;i<20;i++){
}

wanguodu 2005-09-11
  • 打赏
  • 举报
回复
to lorylxw():
那你怎么解释楼主程序的编译错误信息?
lorylxw 2005-09-11
  • 打赏
  • 举报
回复
没有重复定义,支持qhfu(崩溃) 说的。i都是局部的

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧