请问可以解释一下这个c语言程序的运行过程是怎样的吗?
难道f方程中的循环不会导致i从1变成2又变成3,然后遇到staticinti=1之后i又变成1,从而变成一个死循环吗?...
难道f方程中的循环不会导致i从1变成2又变成3,然后遇到static int i=1之后i又变成1,从而变成一个死循环吗?
展开
1个回答
展开全部
注意一,一对花括号括起来的一个区域,是一个定义域,这个域里声明的变量 是这个域的局部量。
for (i=1;i<=3;i++){
static int i=1;
int j=2; *x +=i+j; i++;j++; }
所以这个循环体内的 i 和 j 是 循环体内的局部量,它们与 for (i=..) 的 i 不是同一变量。
注意二,static int i=1; 变量 的生命期与程序一样,所以 函数调用-退出-再调用时,会用前面那次调用后的结果的数值,而不会回到 原始的1。
注意三,int f(int *x) { ... return *x;} 这个调用 既通过 调用 返回 x 的数值,也通过 实际参数传递 x 的数值。 主函数 f(&i) 的调用,改变了 for (i=0;i<20;i++) 里的 i, 所以循环二次就结束了。
为便于理解程序,我们可以添加一些输出语句,看看变量变化过程。
int f(int *x){
int i;
*x=0;
for (i=1;i<=3;i++){
printf("A: i=%d *x=%d ",i,*x);
{static int i=1;
int j=2;
printf("B: i=%d j=%d\n",i,j);
*x +=i+j; i++;j++;
};
}
printf("return %d\n",*x);
return *x;
}
其它不变。得 结果(A: i 是循环控制变量,B:i 是 局部变量 static i):
A: i=1 *x=0 B: i=1 j=2
A: i=2 *x=3 B: i=2 j=2
A: i=3 *x=7 B: i=3 j=2
return 12
12
A: i=1 *x=0 B: i=4 j=2
A: i=2 *x=6 B: i=5 j=2
A: i=3 *x=13 B: i=6 j=2
return 21
21
for (i=1;i<=3;i++){
static int i=1;
int j=2; *x +=i+j; i++;j++; }
所以这个循环体内的 i 和 j 是 循环体内的局部量,它们与 for (i=..) 的 i 不是同一变量。
注意二,static int i=1; 变量 的生命期与程序一样,所以 函数调用-退出-再调用时,会用前面那次调用后的结果的数值,而不会回到 原始的1。
注意三,int f(int *x) { ... return *x;} 这个调用 既通过 调用 返回 x 的数值,也通过 实际参数传递 x 的数值。 主函数 f(&i) 的调用,改变了 for (i=0;i<20;i++) 里的 i, 所以循环二次就结束了。
为便于理解程序,我们可以添加一些输出语句,看看变量变化过程。
int f(int *x){
int i;
*x=0;
for (i=1;i<=3;i++){
printf("A: i=%d *x=%d ",i,*x);
{static int i=1;
int j=2;
printf("B: i=%d j=%d\n",i,j);
*x +=i+j; i++;j++;
};
}
printf("return %d\n",*x);
return *x;
}
其它不变。得 结果(A: i 是循环控制变量,B:i 是 局部变量 static i):
A: i=1 *x=0 B: i=1 j=2
A: i=2 *x=3 B: i=2 j=2
A: i=3 *x=7 B: i=3 j=2
return 12
12
A: i=1 *x=0 B: i=4 j=2
A: i=2 *x=6 B: i=5 j=2
A: i=3 *x=13 B: i=6 j=2
return 21
21
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询