C语言关于循环中包含静态变量

#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>
char *a = "Global";
void global()
{
    printf("a = %s", a);
}
void local()
{
    char *a = "Local";
    printf("a = %s", a);
}
int main()
{
    global();
    local();
    return 0;
}

global()将输出"a = Global",local()将输出"a = Local"

原因简单来说,就是内部代码块作用域({}之间的内容)的声明和定义会覆盖掉外部声明和定义

在local()中,重新声明和初始化了a,再打印的时候,会把全局变量a的值覆盖掉

而在global()中,没有重新声明,因此编译器会使用外部定义的a的值


回到你的例子

#include <stdio.h>
int Square(int i)
{
    return i*i;
}
int main()
{
    int i=0;  //第一次定义并初始化i
    i=Square(i);
    for(;i<3;i++)
    {
        static int i=1;  //具有代码块作用域,空连接,静态存储时期的变量,覆盖第一次对i的定义
        i+=Square(i);
        printf("%d,",i);
    }
    printf("%d\n",i);
    return 0;
}

在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将恢复作用

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-02-02
静态变量的值是持久的(绝对的持久,生命周期跟全局变量一样),初始化的操作实际上是在第一次执行到声明语句的时候进行的。如果写个C++的程序,static里面填一个类观察下构造器的执行时机就能看出来,C应该是类似的。
这个的生命周期和作用域是不一样的,作用域是局部的,但是有永久的生存周期。
相似回答