循环内int i,竟然提示重复申明

zhangwuji154 2010-03-07 03:44:31
void CPointerDlg::OnButton1()
{
// TODO: Add your control notification handler code here
int* p[10];
for (int i=0; i<10; i++)
{
int j = i;
p[i] = &j;
}
CString strTemp, strResult;

for (i=0; i<10; i++)
{
strTemp.Format(_T("%d, "), *p[i]);
strResult += strTemp;
}

GetDlgItem(IDC_STATIC_TEXT)->SetWindowText(strResult);
}
这样是没问题的,但第二个for (i=0; i<10; i++)
如果写成for (int i=0; i<10; i++),就提示重复申明,难道是编译器优化了?

第二个问题int j = i;每次新申明的int j,竟然地址都是一样的,所有指针数组里10个数也是一样的。这可如何是好
(new的话还得释放,难道非逼我用std::auto_ptr?)
...全文
105 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyyoung 2010-03-07
  • 打赏
  • 举报
回复
编译器的问题

05 和 08 都有这个问题
zhangwuji154 2010-03-07
  • 打赏
  • 举报
回复
引用 9 楼 bragi523 的回复:
那样本来就重复定义了啊
那和定义一个变量没什么区别啊

你定义两次int i当然不行了

可是,别的编译器就没事啊.
bragi523 2010-03-07
  • 打赏
  • 举报
回复
那样本来就重复定义了啊
那和定义一个变量没什么区别啊

你定义两次int i当然不行了
zhangwuji154 2010-03-07
  • 打赏
  • 举报
回复
我在C-free4.0里试
for(int i=0;i<9;i++)
{}
int i=9;
也是可以的,为什么只有VC++6.0/Visual C++ 6.0这么特殊呀
zhangwuji154 2010-03-07
  • 打赏
  • 举报
回复
都是每个里头新申明一个i
yxwsbobo 2010-03-07
  • 打赏
  • 举报
回复
引用 1 楼 huliang66 的回复:
如果是VC6.0的话只需声明一个i就可以,如果是2008的话每个循环都必须声明

编译器的问题

2分.



VC老了,for内和for外作用域是一样的
zhangwuji154 2010-03-07
  • 打赏
  • 举报
回复
我晕,估计咱们一上来用的编译器就一样,所以导致这种感觉上的差异,我原来用Borland C++ Builder 6.0,后来用Microsoft Visual C++ 2005/2008,都是每个里头一个i,今天确实是用VC++6.0/Visual C++ 6.0做了个实验,才有这种效果的。
WizardK 2010-03-07
  • 打赏
  • 举报
回复
引用楼主 zhangwuji154 的回复:
void CPointerDlg::OnButton1()
{
// TODO: Add your control notification handler code here
int* p[10];
for (int i=0; i <10; i++)
{
int j = i;
p[i] = &j;
}
CString strTemp, strResult;

for (i=0; i <10; i++)
{
strTemp.Format(_T("%d, "), *p[i]);
strResult += strTemp;
}

GetDlgItem(IDC_STATIC_TEXT)->SetWindowText(strResult);
}
这样是没问题的,但第二个for (i=0; i <10; i++)
如果写成for (int i=0; i <10; i++),就提示重复申明,难道是编译器优化了?

第二个问题int j = i;每次新申明的int j,竟然地址都是一样的,所有指针数组里10个数也是一样的。这可如何是好
(new的话还得释放,难道非逼我用std::auto_ptr?)


第二个循环int i当然不行,第一个循环处已经声明过了int i。
循环内声明变量,何在循环外声明效果一样,如果你需要每次循环内的值都单独存储下来,可以声明一个一维的且维数与循环总次数相同的数组,也可以用一个链表存储结果,动态添加节点。

以上LZ所罗列的变量声明方式可读性和维护性均不强,不建议养成这种习惯。
huliang66 2010-03-07
  • 打赏
  • 举报
回复
如果是VC6.0的话只需声明一个i就可以,如果是2008的话每个循环都必须声明

编译器的问题

2分.

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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