C程序中 int i;for(i=0;;) 与 for(int i=0;;) 两种定义循环变量的方式有什么区别?

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-08-01
for(int i=0;……;……){} . for(int i=0;……;……){} C语言中,这两个i算不算重定义啊?

首先,老兄你的i的确是重定义了,注意在for(int i=0; ...)中声明的i作用范围不在for语句从属的括号内,而是在for本身所在的块内。也就是说,写在for(int i=0;...)中的i与直接在这里写一个int i 对于定义i来说是完全等效的。
至于你的第二个问题,你应该把完整的代码片断拷贝到这里。从你已有的代码来看,根本不可能出现你说的问题,除非是你的数组a[j][k]被超界赋值导致了程序异常。

int DtoH(int n,int c[])
{
for(int i=0; n; i++)
{
c[i]=n%16;
n/=16;
}
return i-1;
}

主要是这个函数对吧。
不会无限循环,因为 n/=16;会让它每循环一次都除以16,当它小于1的时候,因为它是int类型,所以会变成0;这个函数目的在于计算i,理论上再把i作为循环条件,虽然没错,确实不太符合大家的第一习惯。做成while(n)方式计算i更好,更能突出条件跟目的。

两种均可,前者i在for循环外部定义,则i的值在程序未结束之前就一直存在,i所占的内存空间直到程序结束时才释放;后者的i在for循环内部定义,则当for循环结束时,i所占的内存空间就被释放了。一般建议用后者的方式,因为当程序较大时,前者更占内存,这样程序在运行时CPU的负担就更大,内存溢出的风险更大。

首先说明一点,C语言必须将定义都放最前面,后者是不对的,但是C++允许将定义不放最前面
有区别,前者 i 的生存期不单在for里面,还在for外面,后者 i 的生存期就只在for里面,看个简单的例子
int i;
for (i = 0;;)
{
}
if (i == 10) // 正确,因为 i 的生存期在for外面

for (j = 0;;)
{
}
if (j == 10) // 错误,因为 j 的生存期在for里面

简单说,第一种循环结束,i的空间不会释放,i还活着。第二种循环结束i的空间就被释放了