yahoo_hhhu 2021-12-03 12:15 采纳率: 100%
浏览 26
已结题

一个关于函数调用的问题,不理解这个运行结果

问题遇到的现象和发生背景
#include <stdio.h>
int i,j;
void charge(int i)
{
i=2;
j=3;
}

main()
{
i=5;
j=6;
charge(i);
charge(j);
printf("i=%d\tj=%d\n",i,j);
}


为什么这个运行结果是i=5,j=3啊?是主函数里面的i的值把void里面的i值覆盖了吗?两者不是相互独立的吗??还有这个函数调用的逻辑可以给解释下吗?我不理解
希望可以有人可以帮忙解答谢谢

我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

2条回答 默认 最新

  • 冰思雨 2021-12-03 14:09
    关注

    变量的作用域问题。
    代码第2行,声明两个全局变量,他们的作用域是所有源码都可见。
    第3行声明里一个函数,它的参数有个同名的变量,并且类型也相同,是 int i,作为函数的参数,函数体内部当做局部变量来使用。
    由于全局变量与局部变量的作用域重合了,那么,编译器会优先使用局部变量。
    换句话说,代码第5行中的i变量,是函数的参数int i,而不是全局变量的 int i,j 中的i变量。
    代码第6行,因为函数参数列表和函数体中,并没有声明同名为j的变量,所以,编译器会选用全局变量j来使用。
    所以,可以得出一个结论,

    • charge函数的参数i没有什么实际的作用,函数体内对局部变量的赋值并不能反馈到全局变量中;
    • 同时,charge函数会对全局变量j进行赋值3;
    • 无论调用多少次charge函数,参数的值并不会体现到全局变量中,每次调用都会对j赋值3。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月15日
  • 已采纳回答 12月7日
  • 创建了问题 12月3日

悬赏问题

  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大
  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端
  • ¥15 基于PLC的三轴机械手程序