关于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
相关产品推荐
相关产品推荐

