黑马程序员技术交流社区
标题: 求输出结果,并给个详解 [打印本页]
作者: 2014571245 时间: 2014-4-27 11:44
标题: 求输出结果,并给个详解
本帖最后由 2014571245 于 2014-4-30 22:20 编辑
- int sum(int a)
- {
- auto int c=0;
- static int b=3;
- c+=1;
- b+=2;
- return(a+b+c);
- }
- void main()
- {
- int I;
- int a=2;
- for(I=0;I<5;I++)
- {
- printf("%d,", sum(a));
- }
复制代码
结果是:8,10,12,14,16 有点不理解,能给个详解吗?
作者: 执着的土豆 时间: 2014-4-27 12:16
本帖最后由 执着的土豆 于 2014-4-27 12:22 编辑
所有得变量默认就是auto,因此一般定义变量得时候忽略auto。
static用来定义变量时:
变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与栈变量和堆变量的区别。
- int sum(int a)
- {
- auto int c=0;
- static int b=3;
- c+=1;//执行过后,变量c得值每次为1.
- b+=2;//执行过后,变量b得值每次在上一次b得值得基础上加2
- return(a+b+c); //a得值 每次都是2
- //因此每次返回得值都递增2,在上一次得基础上加2
- }
-
- void main()
- {
- int I;
- int a=2;
- for(I=0;I<5;I++)
- {
- printf("%d,", sum(a));
- }
- }
复制代码
作者: 桑托尔 时间: 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
我感觉这楼主。。董哥哥说的是,注意看视频仔细点。这个在老师的视频里详细说了static关键的作用
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |