2 回答

TA貢獻1811條經(jīng)驗 獲得超4個贊
舉個例子來說吧,比如有這么個for循環(huán):
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結(jié)束*/
i++;
}/*局部域A結(jié)束*/
相信學過C++的人都知道域的概念,這里while后面的大括號構(gòu)成一個局部域,而int i和int j則恰恰只是這兩個局部域的變量,因為他們的聲明是在對應(yīng)域的頭部,但是i和j的位置是有區(qū)別的,請仔細看上面的注釋。
因此,上面的例子中,在域A以外引用j是非法的,但是,在域A外引用i不是非法的,因為i就是定義在域A之外的(實際上,i相當于是聲明在全局域,即main域中的)。
我想這也就同樣解釋了為什么樓主的代碼中,第三個for中的i可以不加int,因為這時的i是已經(jīng)在main里面聲明過了的,因此不需要再聲明。而j就不行。
前面說過,第一個j的作用域在第4個for這里已經(jīng)結(jié)束了,因此如果這里不加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條經(jīng)驗 獲得超4個贊
我想應(yīng)該是 上面的主方法里定義過了 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;
}
添加回答
舉報