函数的值传递不是单项的吗?为啥第四个输出的q值是5
#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
(1) C语言中函数参数传递 - Eagle_Fly - 博客园. https://www.cnblogs.com/51try-again/p/10206374.html 访问时间 2023/3/19.
(2) C语言中函数参数传递的三种方式_c语言传参_魏波.的博客-CSDN博客. https://blog.csdn.net/weibo1230123/article/details/75541862 访问时间 2023/3/19.
(3) C语言 函数值传递和址传递 - C语言零基础入门教程 - 简书. https://www.jianshu.com/p/138268d3ef5e 访问时间 2023/3/19.
(4) C 传值方式调用函数 | 菜鸟教程. https://www.runoob.com/cprogramming/c-function-call-by-value.html 访问时间 2023/3/19.
(5) 值传递和地址传递,C语言函数传参方式详解. http://c.biancheng.net/view/371.html 访问时间 2023/3/19.
(6) C/C++ | 三种不同函数参数传递方式 - 知乎. https://zhuanlan.zhihu.com/p/331704827 访问时间 2023/3/19.
int m=3,p=1,q=8;
你这些是全局变量啊,所以无论函数还是调用,都是共享的。