A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© taolove 中级黑马   /  2015-6-2 20:54  /  1988 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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定义上有什么区别?第二个运行为什么会报错?

15 个回复

倒序浏览
围观学习啦,加油
回复 使用道具 举报
本帖最后由 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循环条件,所以循环语句没执行。
请看图理解:

回复 使用道具 举报 1 0
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)
)
回复 使用道具 举报
围观学习。。。。
回复 使用道具 举报
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:02
7#
taolove 发表于 2015-6-3 22:12
不是第二个不在语句块以外定义sum,是这样的
#include
int main()

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


点评

明白了!谢谢!  发表于 2015-6-4 22:46
回复 使用道具 举报
Dast 中级黑马 2015-6-4 21:32:09
8#
李竞还活着 发表于 2015-6-3 22:42
int i=1,sum=0;//这里的i=1就是一个全局变量,它被初始化为1
while(i

全局变量也称为外部变量,它是在函数外部定义的变量。 它不属于哪一个函数,它属于一个源程序文件。
1)        其作用域是从定义该变量的位置开始至源文件结束。
回复 使用道具 举报
Dast 发表于 2015-6-4 21:32
全局变量也称为外部变量,它是在函数外部定义的变量。 它不属于哪一个函数,它属于一个源程序文件。
1)         ...

对啊,应该就是这样。
回复 使用道具 举报
①第二个程序中,sum是在while的大括号中定义的,因此只能在while的大括号中有效,不能在while的大括号外有效。
②第一个程序中,sum是在main函数的大括号中定义的,因此可以在main函数中的所有地方有效,包括while的大括号以内。
③你可以把main函数的大括号包围的区域看成是一个省,而while的大括号包围的区域看成一个市,市中的人肯定不能管省内的人的行动啊!而省内的人可以管市内的人的行动!
回复 使用道具 举报
taolove 来自手机 中级黑马 2015-6-4 22:45:09
11#
已经理解!应该是看循环执行的次序!while语句是在执行是自增了!并得到自增的值,然后执行下面的语句!for语句是在得到i值后,判断是不是符合要求,符合你就执行循环体,然后在自增!所以不一样是因为循环顺序不同!
回复 使用道具 举报
当然有区别了,定义在whil内的sum会在执行完这条whil语句后会清掉
回复 使用道具 举报
围观学习了
回复 使用道具 举报
你的编译器有关,如果是用c99编译的话,就不会报错,推荐你用新点的编译器,因为我们学的都是新标准的c
回复 使用道具 举报
第一个是全局变量,第二个是局部,你在外面访问不了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马