```
#include
int k;
int fun(int n)
{ // 但是调试到这里的时候 n的值为1 为什么?
static int c = 3;
return ((++n)+(++k)+(++c));
}
int main()
{
int i, n = 2;
for (i = 0; i < 2; i++)
printf("%d",fun(n)); // n值出了主函数 值不就没了嘛
return 0;
}
```****
我说一下我对这个程序的见解,如果觉得好的话请点赞。
在这段代码中,变量k是全局变量,它的作用域是整个程序,而变量n和c是fun()函数中的局部变量,它们的作用域只在fun()函数内部。
在fun()函数中,n是函数的形参,它在函数被调用时被赋予了值。而c是一个静态局部变量,它的值在函数调用之间被保留。
在main()函数中,变量n的值在调用fun()函数时被传递给函数,函数内部对n的修改不会影响到main()函数中的变量。
每次循环时,fun(n)都会重新计算,并且n的值始终为2。变量k的值也会在fun()函数中被修改,因为它是全局变量,作用域在整个程序中。
每次调用fun()函数时,k的值都会被修改,并且在函数调用之间保持不变。
在输出结果中,每次调用fun(n)都会返回一个整数值,这些值将被打印到屏幕上。因此,输出的结果将取决于fun()函数内部对变量的修改和调用次数。
以下答案引用自GPT-3大模型,请合理使用:
执行顺序,谢谢****
全局变量是在程序的任何地方都可以被访问,使用的变量即为全局变量。而局部变量只能在定义他的函数中使用,函数外部不能访问。
举个例子来说,下面的代码对全局变量 k 和局部变量 n 进行操作:
#include <stdio.h>
int k; //全局变量
int fun(int n){
static int c = 3; //静态变量
return ((++n)+(++k)+(++c));
}
int main(){
int i, n = 2; //局部变量
for (i = 0; i < 2; i++)
printf("%d",fun(n));
return 0;
}
代码执行顺序:
1.main()函数开始执行,定义并初始化局部变量 n=2;
2.fun(n)函数调用,将参数 n = 2 传入fun()函数;
3.fun()函数开始执行,首先定义并初始化静态变量 c=3;
4.接下来将 n 的值加 1, n=3;
5.将全局变量 k 的值加 1,k=1;
6.将 c 的值加 1, c=4;
7.最后将三个值相加返回 8;
8.函数 fun() 执行完毕,返回主函数,在主函数中输出 8;
9.循环结束,程序结束;
如果我的回答解决了您的问题,请采纳我的回答
你把断点设置在括号的位置,监视的是fun函数的形参n,而不是main函数的实参n,这个位置是fun函数调用起始的位置,在静态变量语句前要进行现场保存,返回值、形参入栈等操作;所以在括号位置,形参还没有入栈和赋值,形参n的值是没有初始化的值。这块内容是编译器自动处理的,高级语言不体现,我们通过转反汇编去看,我用的是VS2017转汇编,如下所示
这个是函数fun(n)调用,可以看到对形参的入栈和赋值在断点之后,所以断点位置的形参是个栈内未初始化值。
然后说一下main函数中的n是否消失?答案是否定的,main函数中的实参n还在栈中没有释放,它的生存周期还没有结束,只是被阻塞了,当fun函数返回后,实参n仍然有效,只有main函数返回后,实参n才会从栈中释放,他的生存周期才结束。
最后说一下k,k是全局变量,在全局变量数据区存储,是个固定的存储区域,它的生命周期在整个软件的运行过程中。当软件停止运行,它的生命周期才结束。
综合一下,有以下几个知识点。
1.局部变量存储在栈内,通过出入栈动态分配空间。对于C语言,函数返回后,局部变量出栈释放。未初始化的局部变量初始值是不确定值。
2.实参变量形参变量是两个变量,在各自的函数栈分配,入口括号位置,函数栈还没有分配好。
3.全局变量存储在全局变量段,存储位置固定,生存周期是整个软件运行期间。未初始化的全局变量为0。