2 回答
TA贡献1811条经验 获得超4个赞
举个例子来说吧,比如有这么个for循环:
for(int i=0;i<3;i++)
for(int j=0;j<4;j++)
do_something();
它可以展开为:
int i=0;
while(i<3)
{/*局部域A开始*/
int j=0;
while(j<4)
{/*局部域B开始*/
do_something();
j++;
}/*局部域B结束*/
i++;
}/*局部域A结束*/
相信学过C++的人都知道域的概念,这里while后面的大括号构成一个局部域,而int i和int j则恰恰只是这两个局部域的变量,因为他们的声明是在对应域的头部,但是i和j的位置是有区别的,请仔细看上面的注释。
因此,上面的例子中,在域A以外引用j是非法的,但是,在域A外引用i不是非法的,因为i就是定义在域A之外的(实际上,i相当于是声明在全局域,即main域中的)。
我想这也就同样解释了为什么楼主的代码中,第三个for中的i可以不加int,因为这时的i是已经在main里面声明过了的,因此不需要再声明。而j就不行。
前面说过,第一个j的作用域在第4个for这里已经结束了,因此如果这里不加int直接对j进行引用将是非法的,所以必须加一个声明。
所以一般遇到这种情况,我提倡这样写:
void main()
{
int i,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
…… // 做某些事情
for(i=0;i<3;i++)
for(j=0;j<4;j++)
…… // 做其他事情
}
P.S. 楼上代码错误,i和j被重复声明。
TA贡献1829条经验 获得超4个赞
我想应该是 上面的主方法里定义过了 i ,而后面的j 前面没有定义,所有不能认识会报错!
如果你这样就不会报错了
void main()
{int a[3][4];
int i,j;
for(int i=0;i<3;i++)
for(int j=0;j<4;j++)
a[i][j]=i;
for(i=0;i<3;i++)
for(int j=0;j<4;j++)
a[i][j]=j;
}
添加回答
举报
