先上代码:
#include <stdio.h>
int fun(int i)
{
return i * i;
}
int main()
{
int i = 0;
i = fun(i);
for ( ; i < 3; i++)
{
static int i = 1;
i += fun(i);
printf("%d,",i);
}
printf("%d\n", i);
return 0;
}
如果按正常直觉来看,for循环体若以循环体内的i值是否小于3为判断条件的话,应只能循环1次,输出2,0才对。但其实for循环里面的i是循环体外部的i,外部的i独立自加,直到循环体外部的i≥3,循环体内的i独立输出,故第一次循环实际上是计算1+1*1=2,第二次循环先将静态变量i的值更新为2,再调用函数计算2+2*2=6,第三次计算6+6*6=42,此时循环体外的i==3,不满足循环条件,循环结束。输出循环体外的i值,为3。
所以程序最终结果为2,6,42,3。
所以我们有如下收获:
1.for循环中i的值,读取的是先前行中定义的变量值,并独立变化,与循环体中的变量没有关系。
2.若将static int i=1;改成int i=1,那么程序输出值将变为:2,2,2,3。这证明默认的auto存储类型无法更新为后面的变量值,因为此存储类型在调用结束后被内存释放掉了,故上一次的值不会被保存。但是static值的数据一直在内存中,只是进入休眠阶段,下一次用到这个数据时自动更新为前一次的数据(如上述for循环循环一次后,i==2,然后再次调用到static int i时,就会调用2)