黑马程序员技术交流社区

标题: 求输出结果,并给个详解 [打印本页]

作者: 2014571245    时间: 2014-4-27 11:44
标题: 求输出结果,并给个详解
本帖最后由 2014571245 于 2014-4-30 22:20 编辑
  1. int sum(int a)
  2. {
  3. auto int c=0;
  4. static int b=3;
  5. c+=1;
  6. b+=2;
  7. return(a+b+c);
  8. }

  9. void main()
  10. {
  11. int I;
  12. int a=2;
  13. for(I=0;I<5;I++)
  14. {
  15. printf("%d,", sum(a));
  16. }
复制代码

   结果是:8,10,12,14,16    有点不理解,能给个详解吗?



作者: 执着的土豆    时间: 2014-4-27 12:16
本帖最后由 执着的土豆 于 2014-4-27 12:22 编辑

所有得变量默认就是auto,因此一般定义变量得时候忽略auto。
static用来定义变量时:
变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与栈变量和堆变量的区别。
  1. int sum(int a)
  2.     {
  3.         auto int c=0;
  4.         static int b=3;
  5.         c+=1;//执行过后,变量c得值每次为1.
  6.         b+=2;//执行过后,变量b得值每次在上一次b得值得基础上加2
  7.         return(a+b+c); //a得值 每次都是2
  8.         //因此每次返回得值都递增2,在上一次得基础上加2
  9.     }
  10.    
  11.     void main()
  12.     {
  13.         int I;
  14.         int a=2;
  15.         for(I=0;I<5;I++)
  16.         {
  17.             printf("%d,", sum(a));
  18.         }
  19.     }
复制代码



作者: 桑托尔    时间: 2014-4-27 17:26
本帖最后由 桑托尔 于 2014-4-27 18:36 编辑

您真问着了!这个知识点我早上看书刚看到。
楼主造嘛,变量一共分4种,auto,static,register,extern。(最后2个不在这里解释,你感兴趣可以自己科普一下,不感兴趣就忽略吧)
因为auto是默认的,所以在定义一个变量的时候无需把auto写出来,咱们一般定义出来的变量,都是auto型。
下面分别为你做下说明
auto:
假如说你在某代码块中 “auto int a=0”这样定义了一个变量,即a是局部变量而不是全局变量。那么当这个代码块或者函数运行完毕的时候,a的地址和里面的值都将会被释放清零。直到该代码块被再次执行为止,而如果此代码块真的被重新执行的话,a也会被刷新,从新定义。
就好比您题中的c,每次执行sum的时候 都会被清零 ,从新定义成c = 0,而后执行“+=1”的操作。

static:
static是相对于auto而言的。如果说你在某代码块中 “static int a=0”这样定义了一个变量的话,虽然它与上面的auto的作用域是一样的,但是,当你这个代码块执行结束后,a值所占用的地址和地址内的数值是不被释放的,那么什么时候释放?直到main函数运行结束。
好比说这个题中的变量b,每次虽然sum执行完毕,但是b的值却并不清零,所以在计算中,针对b的“+=2”运算,是被累加下来的。是以sum函数被执行5次,每次的结果都比上次的多2
作者: 董月峰    时间: 2014-4-27 19:38
本帖最后由 董月峰 于 2014-4-27 19:40 编辑

我简单说下,这个代码的知识点儿:static关键字在c语言中修饰局部变量:1.局部变量作用域不变;2.被修饰的局部变量声明周期延长(随程序生,随程序灭)
所以就有
a一直是2,b(生命周期长,作用域不变)从3不停的自增2,c 局部变量一直是 0 + 1 =1
2+ 5 +1 = 8
2 + 7 +1 = 10
2 + 9 +1 = 12
。。。。。。
// 附:老师在基础视频中详细的讲过这个知识点儿,楼主还是仔细看视频吧

作者: 脸皮猴    时间: 2014-4-27 21:26
董月峰 发表于 2014-4-27 19:38
我简单说下,这个代码的知识点儿:static关键字在c语言中修饰局部变量:1.局部变量作用域不变;2.被修饰的 ...

我感觉这楼主。。董哥哥说的是,注意看视频仔细点。这个在老师的视频里详细说了static关键的作用




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