黑马程序员技术交流社区

标题: 局部变量的作用域问题 [打印本页]

作者: taolove    时间: 2015-6-2 20:54
标题: 局部变量的作用域问题
int i=1,sum=0;
while(i<=100)
{
   sum=sum+i;
   i++;
}
int i=1;
while(i<=100)
{  
   int sum=0;
   sum=sum+i;
   i++;
}
在全局变量中声明了变量,在语句块里对这个变量进行执行,结束语句块后,原来的全局变量被赋予一个新的值,在进行下面的程序会引用这个新值,而不是原来的值了吗?为什么?
这两个程序在sum定义上有什么区别?第二个运行为什么会报错?

作者: 这是829    时间: 2015-6-2 22:06
围观学习啦,加油
作者: Dast    时间: 2015-6-2 23:58
本帖最后由 Dast 于 2015-6-3 00:11 编辑

1、结束语句块后,原来的全局变量被赋予一个新的值,在进行下面的程序会引用这个新值,而不是原来的值了吗?为什么答案是:会引用新的值,不再是原来的。因为上面这个int i=1,sum=0;  这个其实是局部变量,而局部变量也是相对的,在相对下面的while语句块(语句块中没有与i,sum同名命的定义时)时,可以把他们看成是全局变量。所以i,sum会被赋予新的值(i==101,sum=1050),在进行下面的程序就会引用这个新值。
2、下面的之所以报错是因为i在上面已经定义过了,相同变量名不能重复定义。去掉int就不会报错了。由于上面的程序运行后使得i的值为101,不瞒住while循环条件,所以循环语句没执行。
请看图理解:


作者: taolove    时间: 2015-6-3 22:12
Dast 发表于 2015-6-2 23:58
1、结束语句块后,原来的全局变量被赋予一个新的值,在进行下面的程序会引用这个新值,而不是原来的值了吗 ...

不是第二个不在语句块以外定义sum,是这样的
#include<stdio.h>
int main()
{
int i=1;
while(i<=100)
{  
   int sum=0;
   sum=sum+i;
   i++;
}
printf("%d",sum)
)
作者: 洋柿子    时间: 2015-6-3 22:34
围观学习。。。。
作者: 李竞还活着    时间: 2015-6-3 22:42
int i=1,sum=0;//这里的i=1就是一个全局变量,它被初始化为1
while(i<=100)
{
    sum=sum+i;
    i++;//每执行一次循环后,i的值都会加1,并且会赋值给全局变量。
}
int i=1;//函数中已经有了一个变量i,不能再定义相同变量名的变量,但是可以去掉此处的int,直接写i=1;这样就又把开头的全局变量初始化为了1;
while(i<=100)
{  
    int sum=0;
    sum=sum+i;
    i++;
}
作者: Dast    时间: 2015-6-4 21:29
taolove 发表于 2015-6-3 22:12
不是第二个不在语句块以外定义sum,是这样的
#include
int main()

我理解你的意思了,第二个程序之所以出错,是因为sum此时为局部变量,局部变量作用域的问题,局部变量作用域是定义该变量的代码块!!!
在一个代码块里,当遇到 } 时,这个代码块里定义的变量所占内存都会被释放掉,所以你写的第二个程序中sum随着while语句的结束,sum所占内存存的值会被释放掉,再用printf打印sum,此时sum未定义,所以报错。如下图,提示未定义。



作者: Dast    时间: 2015-6-4 21:32
李竞还活着 发表于 2015-6-3 22:42
int i=1,sum=0;//这里的i=1就是一个全局变量,它被初始化为1
while(i

全局变量也称为外部变量,它是在函数外部定义的变量。 它不属于哪一个函数,它属于一个源程序文件。
1)        其作用域是从定义该变量的位置开始至源文件结束。

作者: 李竞还活着    时间: 2015-6-4 21:49
Dast 发表于 2015-6-4 21:32
全局变量也称为外部变量,它是在函数外部定义的变量。 它不属于哪一个函数,它属于一个源程序文件。
1)         ...

对啊,应该就是这样。
作者: lz465350    时间: 2015-6-4 22:39
①第二个程序中,sum是在while的大括号中定义的,因此只能在while的大括号中有效,不能在while的大括号外有效。
②第一个程序中,sum是在main函数的大括号中定义的,因此可以在main函数中的所有地方有效,包括while的大括号以内。
③你可以把main函数的大括号包围的区域看成是一个省,而while的大括号包围的区域看成一个市,市中的人肯定不能管省内的人的行动啊!而省内的人可以管市内的人的行动!
作者: taolove    时间: 2015-6-4 22:45
已经理解!应该是看循环执行的次序!while语句是在执行是自增了!并得到自增的值,然后执行下面的语句!for语句是在得到i值后,判断是不是符合要求,符合你就执行循环体,然后在自增!所以不一样是因为循环顺序不同!
作者: 马贺飞    时间: 2015-6-9 14:46
当然有区别了,定义在whil内的sum会在执行完这条whil语句后会清掉
作者: aofex    时间: 2015-6-9 20:16
围观学习了
作者: Emma    时间: 2015-6-9 22:28
你的编译器有关,如果是用c99编译的话,就不会报错,推荐你用新点的编译器,因为我们学的都是新标准的c
作者: ⒈苆都s.兲憶    时间: 2015-6-9 23:52
第一个是全局变量,第二个是局部,你在外面访问不了!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2