You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言传值调用疑问:两段代码对全局变量的修改结果为何不同

为什么两段代码修改全局变量的结果不同?

第一段代码的运行逻辑

第一段代码中,fun函数的参数是int x, int y——这两个是函数内部的局部变量,和全局作用域的x、y重名了。

在C语言中,当局部变量(包括函数参数)与全局变量同名时,局部变量会遮蔽全局变量:此时在fun函数内部,所有对x、y的访问都会指向这两个局部参数,而非全局变量。

再加上C语言默认是值传递:调用fun(x, y)时,只是把全局x、y的值(10、20)复制了一份传给fun的参数,参数是独立的内存空间。所以fun里的x=30、y=40只是修改了这两个局部参数的值,完全不会影响全局的x、y。因此主函数最后输出全局变量的原值10 20。

第二段代码的运行逻辑

第二段代码中,fun的参数改成了n1、n2,和全局的x、y没有重名。

此时在fun函数内部写x=30、y=40,编译器会直接找到全局作用域的x、y——全局变量的作用域是整个程序(除非被局部变量遮蔽),所以这里的赋值操作直接修改了全局变量本身的内存值。主函数最后输出修改后的全局变量值30 40。

核心理论知识点

  • 变量作用域与名称遮蔽:变量的作用域决定了它能被访问的范围。全局变量作用域覆盖整个程序,局部变量(包括函数参数)作用域仅限当前函数/代码块。当局部和全局变量同名时,局部变量优先,全局变量被暂时隐藏。
  • 值传递机制:C语言函数参数默认是值传递,即实参的值被复制给形参,形参是独立的局部变量,修改形参不会改变实参的原值。只有通过传递指针(地址),才能在函数内部修改实参本身。

参考资料

  • 《C程序设计语言》(K&R):这本书是C语言的经典入门教材,对变量作用域、参数传递、全局/局部变量的区别有清晰且权威的讲解。
  • C语言标准(ISO/IEC 9899):其中关于存储类别、作用域、链接的章节,定义了C语言变量的核心规则,适合深入学习时参考。

内容的提问来源于stack exchange,提问作者Thilina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:32:20