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

为何main函数中变量b的值未变化?C程序运行结果存疑

问题分析:为什么main函数中的b值未发生变化?

首先先贴出你的代码:

void test_func(int a, int b, int *c) {
    a ^= 5;
    *c = a + b;
    b <<= 4;
}
int main() {
    int a = 3, b = 0x011, c = 0;
    test_func(a, b, &c);
    a = (b > c)? b : c;
    printf ("%d %d %d",a,b,c);
}

你疑惑的点非常关键,核心原因在于C语言的参数传递默认是「值传递」,我给你一步步拆解清楚:

  • 当main函数调用test_func(a, b, &c)时,程序会做这几件事:
    • 把main里a的当前值(3)复制一份,传给test_func的形参a
    • 把main里b的当前值(17,也就是0x011的十进制)复制一份,传给test_func的形参b
    • 把main里c的内存地址复制一份,传给test_func的指针形参c
  • 进入test_func后,你对形参a、b做的所有修改(比如a ^=5、b <<=4),都是在这份临时复制的变量上操作的,和main里原来的a、b完全是两个独立的内存空间——修改副本自然不会影响原变量。
  • 而对于指针参数*c,你是直接通过地址访问并修改了main里c变量所在的内存,所以main里的c会被更新为23,这也是符合你预期的。

再对应到你的执行过程:
你在test_func里计算的b <<=4(17左移4位变成272),这个修改只作用于函数内部的形参b,main里的b还是保持最初的17不变。后续main里的a = (b > c)? b : c,因为17 < 23,所以a被赋值为23,最终输出就是23 17 23。

如果想要让main里的b也被test_func修改,你需要把b也改成指针传递,比如修改函数定义为:

void test_func(int a, int *b, int *c) {
    a ^= 5;
    *c = a + *b;
    *b <<= 4;
}

然后main里调用时写成test_func(a, &b, &c),这样函数里对*b的修改就会直接作用于main里的b变量了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:21:07