黑马程序员技术交流社区

标题: 关于a赋值的问题 [打印本页]

作者: 愿我能    时间: 2014-3-26 14:28
标题: 关于a赋值的问题
本帖最后由 愿我能 于 2014-3-26 18:16 编辑
  1. #include <stdio.h>
  2. int a, b = 10;

  3. void test()
  4. {
  5.     a++;
  6.    
  7.     printf("a=%d ", a);
  8.    
  9.    
  10.     int a = 0;
  11.     a++;
  12.     printf("a=%d\n", a);
  13. }

  14. int main()
  15. {
  16.     test();
  17.     test();
  18.     test();
  19.     return 0;
  20. }
复制代码
输出结果为
a=1 a=1
a=2 a=1
a=3 a=1。
不太懂 a的值是如何赋值的
    这几天开始复习下代码,以前没做过练习题,现在才知道练习题才是能检验是否明白。


作者: 周宇华    时间: 2014-3-26 14:51
test函数里面第一个a++;是给全局变量+1。
第二个a++是给局部变量+1,局部变量与全局变量重名时,优先调用局部变量。
所以test函数调用1次,全局变量a的值就+1,而局部变量因为函数结束会被释放,所以每次局部变量a的值一直是1.
作者: FlyTrem    时间: 2014-3-26 15:11
本帖最后由 FlyTrem 于 2014-3-26 15:18 编辑
  1. #include <stdio.h>
  2. int a, b = 10;

  3. void test()
  4. {
  5.     a++;
  6.    
  7.     printf("a=%d ", a);
  8.    
  9.    
  10.     int a = 0;
  11.     a++;
  12.     printf("a=%d\n", a);
  13. }

  14. int main()
  15. {
  16.     test();
  17.     test();
  18.     test();
  19.     return 0;
  20. }
复制代码

首先我对你的代码能否运行有很大的疑问,  
a++;
   
    printf("a=%d ", a);
在你没对全局变量a进行初始化你是如何对其进行a++操作的?
接下来我对a是如何进行赋值的做下注释:
    a++;//对a进行自加操作
   
    printf("a=%d ", a);//打印a的值,每次打印都是全局变量a自加1后的结果
   
   
    int a = 0; // 这是一个新定义的局部变量且赋值为零,与上面的a不同的
    a++; //  a进行自加
    printf("a=%d\n", a);//在打印a值,这个地方可以确定永远是1的

作者: agelessman    时间: 2014-3-26 15:17
还是用内存分析比较好,视频里说的很清楚 ,详情请看ios基础》03c语言》复杂数据类》其他数据类》第一个视频呢
就是讲全局变量和局部变量的,

作者: Er01c    时间: 2014-3-26 15:45
1、函数外的变量a为全局变量,未初始化,系统会默认赋值0【只创建一次,不会在被初始化为0】
2、函数test()中的int a =0;中的a为局部变量,每次调用test()都会重新初始化。
作者: 程浩    时间: 2014-3-26 16:06
哈哈
就像你去网吧
你每次开机界面都一样,即使是玩的时候删了一堆东西,或者下了一堆,当你重启的时候依然那样。这就是第二个a
但你玩的游戏数据是变的,因为游戏不在网吧局域网,而是在互联网下。这就是第一个a
:lol
作者: 远人    时间: 2014-3-26 17:47
我觉得你是有两个地方不明白:
1、第一个全局变量a的值没有初始化,也能执行成功?
2、这两个第一个a怎么不受第二个a的影响,反而在递增?
你可以这样来检验,不明白就把函数分拆。

1、1、第一个a的值没有初始化,也能执行成功?
        看我注释掉其他行代码,看它的运行结果。
  1. #include <stdio.h>
  2. int a, b = 10;

  3. void test()
  4. {
  5. //    a++;
  6.    
  7.     printf("a=%d ", a);
  8.    
  9.    
  10. //    int a = 0;
  11. //    a++;
  12. //    printf("a=%d\n", a);
  13. }

  14. int main()
  15. {
  16.     test();
  17. //    test();
  18. //    test();
  19.     return 0;
  20. }
复制代码


这里的输出结果是a = 0,说明这个全局变量默认值是0.

2、这两个第一个a怎么不受第二个a的影响,反而在递增?
这里主要就是理解全局变量和局部变量,先单独感受全局变量,看我注释掉其他行代码,输出运行结果
  1. #include <stdio.h>
  2. //int a, b = 10;

  3. void test()
  4. {
  5.     a++;

  6.     printf("a=%d ", a);
  7.    
  8.    
  9.     int a = 0;
  10.     a++;
  11.     printf("a=%d\n", a);
  12. }

  13. int main()
  14. {
  15.     test();
  16.     test();
  17.     test();
  18.     return 0;
  19. }
复制代码

这样注释之后就有报错,报错第一个a没有定义,说明它是全局变量,并不受第二个int a = 0的影响,所以它的值在运行时是不受第二个int a = 0的影响,一直累加,所以出现a =1, a =2,a =3。

真正的原理还是要去看老师的讲解,按照3楼的地址去看,我这只是给你做检验
作者: 愿我能    时间: 2014-3-26 18:08
周宇华 发表于 2014-3-26 14:51
test函数里面第一个a++;是给全局变量+1。
第二个a++是给局部变量+1,局部变量与全局变量重名时,优先调用 ...

谢谢 ,有点明白了
作者: 愿我能    时间: 2014-3-26 18:09
FlyTrem 发表于 2014-3-26 15:11
首先我对你的代码能否运行有很大的疑问,  
a++;
   

代码第二行 赋值了, 这其实是零基础代码里的练习题.




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