求解答,第八题答案为什么事5,11

img


这道题答案为什么是5,11
求解!
不是说形参不能影响实参嘛,为什么不是5,5

因为函数fun()中的静态变量m和i的值改变了。

第一次调用fun():

首先,x=1,y=1,m=0,i=2;

然后,i+=m+1,i=i+m+1=2+0+1=3;

接着,m=i+x+y, m = 3+1+1=5;

最后,返回5;

所以第一次调用k=fun(j,m)=5,打印出k的值为5;

第二次调用fun():

首先,x=1,y=1,m=5,i=3;(因为m和i都是静态变量,所以其值为第一次调用fun()后改变后的值)

然后,i+=m+1, i=i+m+1=3+5+1=9;

接着,m=i+x+y=9+1+1=11;

最后,返回11;

所以第二次调用k=fun(x,y)=11,打印k的值为11。

测试代码如下:

参考链接:

C语言:关键字---static(声明静态变量)_静态变量声明_根号五的博客-CSDN博客 static在C语言里面有两个作用,第一个是修饰变量,第二个是修饰函数。1、static修饰变量按照作用范围的不同,变量分为局部变量和全局变量。如果用static修饰变量,不论这个变量是全局的还是局部的都是存储在静态数据区。1.1 局部变量普通局部变量:在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。普通局部变量存储于进程栈空间,使用完毕会立即释放。静态局部变量:使用stat https://blog.csdn.net/MQ0522/article/details/110850832


#include <stdio.h>

int fun(int x,int y){
// https://blog.csdn.net/MQ0522/article/details/110850832    
    static int m=0,i=2;
    printf("\nx=%d,y=%d,m=%d,i=%d\n",x,y,m,i);
    i+=m+1;
    printf("x=%d,y=%d,m=%d,i=%d\n",x,y,m,i);
    m=i+x+y;
    printf("x=%d,y=%d,m=%d,i=%d\n\n",x,y,m,i);
    return m;
} 

int main(void){
    
    int j=1,m=1,k;
    k=fun(j,m); printf("%d,",k);
    k=fun(j,m); printf("%d\n",k);
    
    return 0; 
}

img

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^