【C语言】一道简单的局部变量和全局变量的题
#include <stdio.h>

int main(){

int a=1,b=3;
{
    int a=1,c=2;
    a=a+b;
    b=c+a;
    printf("a=%d,b=%d\n",a,b);
}
printf("a=%d,b=%d\n",a,b);

return 0;


}

编译器输出是
a=4,b=6
a=1,b=6
请问第二个输出的时候,为什么b是6呢

4个回答

b=c+a是再a=a+b之后执行的,a=a+b时,a的值变为4,而之后算b=c+a的时候,c=2,a=4的情况下,b=6啊

qq_22847605
qq_22847605 回复jkjkre: 回复jkjkre:不是,是全局变量,他在第一行声明的变量,所以整个过程对他的修改是有效的,所以是6,而a,有两次声明,一次在首行,该变量是全局有效的,但在第二个花括号中,它声明了另一个局部变量a,这时候第二个花括号里面优先使用的是自己定义的a,在第二个花括号外面之后,局部变量a失效,使用的是全局变量,所以是1
一年多之前 回复
jkjkre
jkjkre 花括号里面的b不是局部变量吗?而第二个printf的a输出的是1而不是4,为什么第二个b不是3呢
一年多之前 回复

括号里的b哪里是局部变量了,b是在代码块外面定义的,只是在代码块里面对它赋值,最后输出的肯定是6啊

JRneymar
JRneymar 回复JRneymar: 说错了,是第一个a是在代码块外部定义的
一年多之前 回复
JRneymar
JRneymar 第二a是在代码块外部定义的,中括号里重新定义一个a,这里面对a赋值不会影响外层的a。
一年多之前 回复
qq_41190260
不会弹钢琴的程序员 回复jkjkre: a这里定义为全局变量
一年多之前 回复
jkjkre
jkjkre 那为啥第二个a输出的是1呢
一年多之前 回复

你没在括号内定义b
所以b一直是全局变量
你在括号外定义的a的全局变量
括号内又定义了a,是局部变量
所以a有2次不同值的输出
b只定义了全局变量
你在{}内将b再定义一次,就会输出正确了。

变量的使用需要遵循最基本的两项要求:
1. 就近原则:当全局变量和局部变量出现变量名称相同,程序调用变量时,将会使用局部变量作为当前变量,
实际上全局变量和局部变量是两个完全不同的变量,拥有相互独立的内存空间,使用上也不相互影响。
2. 作用域: 局部变量的有效范围从当前代码块始到当前代码块终。

在main函数中包含大括号中的声明的变量a只在大括号中有效,在大括号内调用的任何有关a变量的引用,
均是指在大括号内声明a变量,而不是在main函数起始声明的a变量。

当代码块结束,代码块所占用的资源被释放,此时对a变量的引用为main函数起始时声明的a变量

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问