为啥第四个输出的q值是5#include <stdio.h>

函数的值传递不是单项的吗?为啥第四个输出的q值是5

img


#include
int m=3,p=1,q=8;
void sub(int x,int y)
{
 int p=7;
 printf("%d,%d,%d\n",m,p,q);
 m=x+y;        p=x/y;        
 q=m+p;
printf("%d,%d,%d\n",m,p,q);
}
int main()
{
int m=2;
printf("%d,%d,%d\n",m,p,q);
sub(m,p);
printf("%d,%d,%d\n",m,p,q);
return 0;
}

因为q是全局变量,其生命周期是整个程序范围,当程序运行结束才销毁,局部变量是出了函数会销毁。因此,对于q的改变是一直保持的,出了sub函数还是保存着之前被修改为5的q

该回答引用NewBing

你好,这是Bing。我可以帮你解答这个问题。👋


C语言中函数参数传递的方式有两种:值传递和地址传递¹²³。值传递就是把实参的值复制给形参,而不影响实参的值⁴⁵。地址传递就是把实参的地址(或指针)作为形参,从而可以改变实参的值³⁶。


你的代码中,sub函数使用了值传递,所以在sub函数内部对m,p,q的修改不会影响到main函数中的m,p,q。但是你需要注意一点,sub函数和main函数中都有一个全局变量m,它们并不是同一个变量。在sub函数中,全局变量m被局部变量m遮蔽了,所以对m的操作只影响局部变量m。而在main函数中,全局变量m没有被遮蔽,所以对m的操作只影响全局变量m。


所以,在第四个输出时,q的值是5是因为它等于sub函数内部计算出来的q(2+1),而不是main函数中原来的q(8)。如果你想让sub函数能够改变main函数中的q,你需要使用地址传递,并且在sub函数中用指针来操作q。

源: 与必应的对话, 2023/3/19

int m=3,p=1,q=8;
你这些是全局变量啊,所以无论函数还是调用,都是共享的。