| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1668 人关注过本帖
标题:【有关静态变量赋值问题求解】
只看楼主 加入收藏
邹阳
Rank: 6Rank: 6
等 级:侠之大者
威 望:4
帖 子:124
专家分:402
注 册:2015-10-8
结帖率:73.68%
收藏
已结贴  问题点数:20 回复次数:3 
【有关静态变量赋值问题求解】
  首先,本人在上课过程中接触到了一道题,如下:
#include "stdio.h"
int f(int n)
{
    static int k,s;
    n--;
    for(k=n;k>0;k--)
    {
        s+=k;
    }
    return s;
}
void main()
{
    int k;
    k=f(2);
    printf("%d,%d",k,f(k));
}

  执行过代码后得出的结果是:“1,1”,询问过老师得知,static静态变量在定义并赋值后下面就不能再次赋值了,同时,如果在定义静态变量时未赋值,那么此变量默认被赋值为0。
那么,问题来了,为什么打印的第二个数字是1,而不是0呢?
我的疑惑点:通过执行k=f(2)时,向调用函数f传进了一个"2"进行计算并通过返回值s传出结果赋值给k。我们可以看到s在调用函数中被定义为静态变量,既然定义时未赋值,那么s不就默认被赋值为0了吗?这算不算赋了初值,既然赋了初值,为什么在把k=1传入f()运算时因为不符合for()条件而跳过后会再次返回一个1呢?此时此刻s不是0吗?
  当然,我明白静态变量虽然不能被二次赋值,但是静态变量是可以进行运算的,但在第一次传值运算时,返回值s=1,第二次返回值s为什么仍然等于1呢?1不是s的计算值吗?如果s一直等于1,这不就算是把1赋值给s了吗?
  问题可能赘述,望解答。
搜索更多相关主题的帖子: include return 
2017-04-08 16:59
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:10 
程序代码:
#include "stdio.h"
int f(int n)
{
    static int k,s;
    n--;//n执行了一次自减。第一次调用,n = 2,自减为1,for执行一次,s = 1; 第二次调用,n = 1,执行自减为0,for不执行。
    for(k=n;k>0;k--)
    {
        s+=k;
    }
    return s;
}
void main()//吐槽一句,这是非法的(虽然能过编译并且执行,但在某些严格执行ANSI C标准的编译器上通不过)。
{
    int k;
    k=f(2);
    printf("%d,%d",k,f(k));
}


[此贴子已经被作者于2017-4-8 17:17编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-04-08 17:09
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:10 
首先const是静态定义变量,值不会改变。
第一次执行了过后返回的k = s  值是1。
第二次进去n--  n的值为0。 k = 0 > 0 ?   不执行循环。直接返回s。因为你是静态定义,函数结束,他的还在内存中不会回收, 再次返回还是上次的值
2017-04-08 17:17
邹阳
Rank: 6Rank: 6
等 级:侠之大者
威 望:4
帖 子:124
专家分:402
注 册:2015-10-8
收藏
得分:0 
回复 2楼 renkejun1942
嗯嗯,问题得到解决了,谢谢。

I'm a new comer
2017-04-08 21:35
快速回复:【有关静态变量赋值问题求解】
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016637 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved