鱼C论坛

 找回密码
 立即注册
查看: 949|回复: 4

[已解决]c语言中局部静态变量。

[复制链接]
发表于 2019-10-17 16:58:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大家好,楼主初学C语言,有些问题还望过来人不吝指教,先谢谢了。
  1. #include<stdio.h>
  2. int test(int a, int b)
  3. {
  4.         static int c;
  5.         c=a+b;
  6.         return c;
  7. }
  8. void main()
  9. {
  10.         int i,j;
  11.         for(i=0;i<3;++i)
  12.                 j=test(1,1);
  13.         printf("%d",j);
  14. }
复制代码

第一个函数test中定义了一个静态局部变量c,按说在多次调用test时,c的值是只初始化一次,以后不会再初始化。
但我用VS2010编译运行,结果一直是2,也就是说main函数中每次调用test,静态变量c每次都被初始化为0,与书中静态局部变量在运行前只初始化一次不相符。
请教大家是我哪里理解错了呢?
最佳答案
2019-10-17 17:13:52
        定义静态变量的时候可以给这个变量赋初值,静态变量赋初值的操作是在代码编译的时候实施的,不会在调用函数的时候实施。

        你定义的 test() 函数完全没有用到静态变量的特性,看看我设计的 sum() 函数,用途是计算累加:
  1. #include <stdio.h>

  2. int sum(int a)
  3. {
  4.         static int b = 0 ;
  5.         b += a           ;
  6.         return b         ;   
  7. }

  8. int main(void)
  9. {
  10.         int d , k                                  ;
  11.         for(k = 0 ; k < 100 ; k ++) d = sum(k + 1) ;
  12.         printf("d = %d\n" , d)                     ;
  13. }
复制代码

        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-17 17:13:52 | 显示全部楼层    本楼为最佳答案   
        定义静态变量的时候可以给这个变量赋初值,静态变量赋初值的操作是在代码编译的时候实施的,不会在调用函数的时候实施。

        你定义的 test() 函数完全没有用到静态变量的特性,看看我设计的 sum() 函数,用途是计算累加:
  1. #include <stdio.h>

  2. int sum(int a)
  3. {
  4.         static int b = 0 ;
  5.         b += a           ;
  6.         return b         ;   
  7. }

  8. int main(void)
  9. {
  10.         int d , k                                  ;
  11.         for(k = 0 ; k < 100 ; k ++) d = sum(k + 1) ;
  12.         printf("d = %d\n" , d)                     ;
  13. }
复制代码

        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-17 17:25:34 | 显示全部楼层
jackz007 发表于 2019-10-17 17:13
定义静态变量的时候可以给这个变量赋初值,静态变量赋初值的操作是在代码编译的时候实施的,不会在 ...

多谢回复,但是我一直不明白你每次调用SUM,静态变量b的值会随着每次的调用而改变,为什么我的test每次调用,静态变量c一直不累加?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-17 17:33:14 | 显示全部楼层
jackz007 发表于 2019-10-17 17:13
定义静态变量的时候可以给这个变量赋初值,静态变量赋初值的操作是在代码编译的时候实施的,不会在 ...

静态局部变量不在堆栈里,编译时就已经初始化,函数test设计的目的就是为了测试静态变量c的值是否是只初始化一次,,,但是我一直不明白为什么C的值不累加。。还望指教。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-17 17:36:15 | 显示全部楼层
jackz007 发表于 2019-10-17 17:13
定义静态变量的时候可以给这个变量赋初值,静态变量赋初值的操作是在代码编译的时候实施的,不会在 ...

多谢,理解了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 05:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表