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

关于C语言变量作用域与代码输出结果e的疑问

变量作用域与值修改问题解析

示例代码

#include <stdio.h>

int var0 = 5;

int main() {
  int var1 = 7;
  int var2 = 9;

  printf("a) %d, %d, %d\n", var0, var1, var2);
  {
    int var1 = 17;

    printf("b) %d, %d, %d\n", var0, var1, var2);
    var0 = 15;
    var2 = 19;
    printf("c) %d, %d, %d\n", var0, var1, var2);
    {
      int var0 = 25;
      printf("d) %d, %d, %d\n", var0, var1, var2);
    }
  }
  printf("e) %d, %d, %d\n", var0, var1, var2);
}

编译输出结果

a) 5, 7, 9
b) 5, 17, 9
c) 15, 17, 19
d) 25, 17, 19
e) 15, 7, 19

疑问解析

你误解的核心是混淆了「重新声明变量」和「修改已有变量」的区别:

  • 对于var1:内层代码块里用int var1 = 17;重新声明了一个同名局部变量,这个变量和外层main中的var1是完全独立的两个变量,内层修改这个新var1不会影响外层的var1,所以e)行的var1还是初始值7。
  • 对于var0:内层的第一个大括号里并没有重新声明var0,这里修改的是全局作用域的var0(直到最内层小括号才声明了一个局部var0,但这个局部var0只在最内层生效,不影响外部修改),所以var0 = 15;直接改变了全局var0的值,e)行自然能看到这个修改后的值15。
  • 对于var2:内层代码块里同样没有重新声明var2,var2 = 19;修改的就是main作用域里的那个var2,所以e)行的var2是修改后的19。

简单说:只有当内层重新声明了同名变量时,才会和外层变量隔离;如果只是直接修改同名变量(没有重新声明),那操作的就是外层的那个变量,修改会被保留到外层作用域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 17:39:24