weixin_43408535
-cfyjbjonn
采纳率73.3%
2019-01-22 11:03 阅读 2.1k

c语言static加与不加的区别

80

问错了,编辑一下,我是想问为什么加了static之后输出的y全部是3,但是x的输出又是根据static的y的变化得到的?

我知道x+=y++的意思,x,y的定义写在函数外面是什么意思。

以及请问能否详细解释加和不加static的输出结果是怎么得到的,感谢。

#include <stdio.h>
int x = 0,y = 3;
void fun()
{
   // static int y = 1;
    x+=y++;
}

void main()
{
    int i;
    for(i = 1; i < 4; i++)
    {
        fun();
        printf("%d,%d\n",x,y);
    }
}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

11条回答 默认 最新

  • 已采纳
    u013216821 大内群英7 2019-01-22 14:53

    我明白楼主的问题,首先我对楼主的代码做了一些更方便直观探索数据变化的修改,将不加static和加了之后的代码和结果呈现在这里:
    不加static
    加static
    接下来一一回答楼主的问题:
    为什么加了static之后输出的y全部是3,但是x的输出又是根据static的y的变化得到的?
    看图二既打印了函数func1()内部y的值随后又打印了main()函数中的y值,一目了然,
    加了static y = 1;这行代码之后,函数func1()中的静态变量y覆盖外面定义的全局变量y,
    每次func1()中操作的都是它自己内部定义的占有固定存储位置的变量y,该值在函数func1()内部可见,并且累加,
    然而离开该函数,便被外面的全局变量y所覆盖,所以main()函数打印的是全局的y,始终是3.

    x,y的定义写在函数外面是什么意思
    x,y写在函数外面表明这两个变量全局可见,超越函数代码段的限制,只要没有被覆盖可以在任何地方被修改,并保留修改后的值,一旦被覆盖,在覆盖到的代码段对其操作无效,操作的只是同名的段内覆盖定义。

    详细解释加和不加static的输出结果是怎么得到的
    我认为楼主就直接看我的两站加和不加的前后对比的附图足以能明白变量的变化过程和状态,第一个问题其实已经详细回答了加static的结果如何得到,不加static就更容易理解了,结合第二个问题的回答,因为不加的话它就纯粹是个全局变量,有没有别的定义覆盖它,一直被能修改的地方修改,并保留修改后的结果。

    望采纳,谢谢

    点赞 评论 复制链接分享
  • qq_40924865 qq_40924865 2019-01-22 11:53

    大家的是理论性的讲,我就通俗的解释吧:
    1.使用static就表示次变量霸占了固定的存储位置,所以楼主这段代码加不加static和运算结果无关。
    2.变量定义在函数里面,只能此函数使用;定义在外面,所有的函数都可以使用。

    点赞 2 评论 复制链接分享
  • weixin_41654661 葛建文 2019-01-22 15:55

    static 是静态变量,一般用在函数体里面
    静态的意思是固定存储位置,在磁盘中存储位置一开始是哪,一直都是那。
    这样的话,当下一次再访问这个变量时,它的值还是上一次修改过的。
    也就是说按照一般的存储规则,先后两次进入函数,函数里的变量是会变的。但是由于静态变量有它单独、不会改变的存储地址,所以先后两次调用,变量值会是前一次的值。(只可以在定义时初始化,之后只可以访问修改,不再是初始化)

    点赞 2 评论 复制链接分享
  • qq_38364718 Laupup 2019-01-22 11:17

    xy写在外面,在这个代码段里是相当于一个全局变量,y的作用域更广,3其实是x=y,然后y++,static自己去翻下书

    点赞 评论 复制链接分享
  • weixin_41461277 _ZGq 2019-01-22 11:21

    如果在函数内定义了一个与外界重名的变量(y),那么局部变量会覆盖外界的变量,所以如果把那一行取消注释,就会出现这样的情况。

    在函数外面定义变量,那么这个变量就是一个全局变量,所有函数可见,初始值默认为0。

    (补充一个讲static的链接:https://www.cnblogs.com/JMatrix/p/8194009.html)

    点赞 评论 复制链接分享
  • cadrer cadrer 2019-01-22 11:32

    1:加了static后表示该函数失去了全局可见性,只在该函数所在的文件作用域内可见

    2:当函数声明为static以后,编译器在该目标编译单元内只含有该函数的入口地址,没有函数名,其它编译单元便不能通过该函数名来调用该函数,这也是对1的解析与说明

    点赞 评论 复制链接分享
  • weixin_43388573 宁致远的博客 2019-01-22 11:32

    static声明为静态的,此处y相当于全局变量,在fun()中被使用的也就是这个全局变量。
    当在fun()内部再次定义static int y = 1时,此处y是局部变量,被声明为静态的。在fun外定义的全局变量y在这个函数内被屏蔽,虽然同名,但实际上是两个不同的变量

    点赞 评论 复制链接分享
  • AaricYang HelloAaric 2019-01-22 11:57

    图片说明

    --不加static时的y输出如上图所示,是累加后输出,依次为4、5、6,没有出现你说的“不加static的话输出的y全部是3”的现象啊!

    --加上static的话,全局变量y,和fun()函数里的y,是两个不同的变量。所以,fun()函数里的累加操作,只作用于static变量;而printf输出的,一直是全局变量y,因此直输出3.

    点赞 评论 复制链接分享
  • lyztyycode 戴着眼镜看不清 2019-01-22 12:00

    加static是全局作用域,不加的话因为你的函数体里面有临时变量y与外面的y重名了,这样函数内y++以后,出函数的时候,临时作用域的y生命周期结束,所以你的输出还是函数外面的y
    简单的说你的y++操作是对函数内的y++,输出的是函数外的y。所以一直是3
    如果对你有帮助,希望采纳,谢谢

    点赞 评论 复制链接分享
  • chinarealone chinarealone 2019-01-22 13:34

    x,y的定义写在函数外面是全局变量,你在函数内定义的y是局部变量,mian函数内有效的是全局变量。所以与你是否定义static无关,只是变量作用域的问题

    点赞 评论 复制链接分享
  • hwfhotmial 不知百问 2019-09-10 09:28

    在函数体内加上static属于局部变量

    点赞 评论 复制链接分享

相关推荐