#include <stdio.h>
int Square(int i)
{
return i*i;
}
int main()
{
int i=0;
i=Square(i);
for(;i<3;i++)
{
static int i=1;
i+=Square(i);
printf("%d,",i);
}
printf("%d\n",i);
return 0;
}
基本的概念比较清楚,程序的执行过程和变量值的变化理不清,希望有个实例顺一下。
运行结果:2,6,42,3.
首先,要知道作用域的概念。C有代码块作用域,文件作用域和函数原型作用域。详细内容书里面可以讲一章,涉及到链接类型,作用域,存储时期。这里只说一点,你可能比较关心,看下面这个例子
#include <stdio.h>global()将输出"a = Global",local()将输出"a = Local"
原因简单来说,就是内部代码块作用域({}之间的内容)的声明和定义会覆盖掉外部声明和定义
在local()中,重新声明和初始化了a,再打印的时候,会把全局变量a的值覆盖掉
而在global()中,没有重新声明,因此编译器会使用外部定义的a的值
回到你的例子
#include <stdio.h>在for后面小括号的内容,没有新的i的声明,也没有进入{},不会被里面对i新的定义覆盖,依然用外部i的值,因此从0开始,2结束。static int i=1;这句话会在for下面的{}作用域覆盖掉外部i的定义。有一点,静态变量具有静态存储时期,放在全局/j静态变量区而非栈区,计算机会一直存储他的值到下一次调用。但是for结束后,外部i的定义又会回恢复作用,结束时i=2。
追问循环那有一点没弄清:初始i=0,满足i<3,进入循环for,i被重定义为1,经过i+=Square(i),i的值变为2,输出2,;紧接着应该执行i++,此时为i变为3,不满足i<3,跳出循环。。。这样想好像没有用到static的保留上次值的作用。
想请教下哪里想错了=_=!!……
还是作用域的问题。for的{}中定义的新的i只在for的{}中占优,出了{}就是外部定义的i起作用,for的()是在{}外部,因此外部的i将恢复作用