#include<stdio.h>
int sum(int a)//第一步看:sum是个函数,它有一个整型参数int a,从这一行直接看第二步即main函数了
{
int c = 0;
static int b = 3;
c += 1;
b += 2;
return (a + b + c);
}
int main()//第二步看:main函数内部(代码块内)
{
int i;
int a = 2;//创建了i、a
for (i = 0; i < 5; i++)//for循环,循环了5次
{
printf("%d,", sum(a));//每一次循环就会调用sum函数,sum函数调用完之后产生的结果通过%d的形式打印。
}//那按着这个循环5次的话,这儿应该打印5次,那每次打印的数字分别是什么呢?即调用每次sum返回的值是什么?
从进入for循环i=0时第一次上去调用sum,sum圆括号中是2,即sum传进来的是a,a是2,所以把2传过去了。走到int sum(int a)行,这个地方的a就是2,
紧接着创建了c,是0,static int b = 3这里的b是创建的静态的变量,值是3,(静态的变量的特点是:静态局部变量出了它的范围,即出了它所在的代码块,就是函数调用结束时3是不会销毁的),然后c+1,b+2,a+b+c=2+5+1=8,return 8就把8返回去了,所以第一次打印的结果是8
第一次函数调用时执行完return即出了代码块就是跳出去了,因为c,a二者是局部变量,并没有被static修饰,所以这两个变量出了它们的范围就销毁了不在了,static修饰的变量b,它出了范围不销毁,意味着下次进入它范围时它还在,还保留着5。
第一次打印完,再上去(在for循环中)执行i++,i=1<5,再进入for循环,即进入printf()函数中,又要调用sum函数(),所以再上去调用,进入int sum(int a),这次调用又传了a过去,此时传的a还是2,c是局部变量,每次进来都要重新创建,因为上次走之后它销毁了,所以这次重新创建,c是0,static b因为b上次出去之后没有被销毁,所以它没有新创建,还是原来的b,为5,c是刚创建的0,+1后是1,b是5,+=2后变成7,a+b+c=2+7+1=10,return 10返回时就把10带回printf()函数中了,即打印10。出这次sum()函数时还是一样的道理,a和c会销毁,因为出它们的范围(作用域)了,生命周期就结束了。但是b还会保留上次刚刚留下来的值,是7,b不销毁。所以下次进入时a和b分别又是2和0,只有b在增长2。
所以推算的结果是:8,10,12,14,16
/*return 0;*/
}//8,10,12,14,16,
怎么看for循环和有静态变量的一个例子
于 2021-11-23 13:26:34 首次发布