VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 172|回复: 2

[已解决]关于static关键字的一点疑问

[复制链接]
07_avatar_middle
最佳答案
0 
在线会员 发表于 2020-2-18 15:58:06 | 显示全部楼层 |阅读模式
程序代码如下:

#include <iostream>
using namespace std;

int aaa(int x)
{
        static int y = x;
        return y;
}
int bbb(int x)
{
        static int y;
        y = x;
        return y;
}

int main()
{
        int a = 1, b = 2, c = 3;
        cout << aaa(a) << endl << aaa(b) << endl << aaa(c) << endl;
        cout << bbb(a) << endl << bbb(b) << endl << bbb(c) << endl;

        return 0;
}

输出结果是 :
3
3
3
1
2
3
个人理解
前3个输出3,是因为cout函数压栈是先把aaa(c)压入栈计算的结果,然后再aaa(b),然后再aaa(a)分别得到3个结果,也就是说 先计算的函数实际是aaa(c) 所以 静态变量y被初始化成了3, 再计算aaa(a)和aaa(b)的时候 static int y = x;这一行就相当于跳过了,Y的值一直是3,所有输出结果是 3个3

第二行输出 1 , 2 ,3 实际函数压栈顺序和上面一样, 先是计算bbb(c)的值,此时返回的是3, 第二次计算bbb(b)的值,此时只是 static int y 这一行跳过, 仍然执行 y=x,所以输出结果是2, 同理最有一个结果是1, 然后按顺序打印出来是 1   2   3

个人结论:  static 修饰的变量只有在定义的同时初始化,才初始化这一次, 如果只声明不赋值, 在之后仍然可以对此变量正常赋值, 和普通变量没区别.
问题:不知道我上面分析的是否正确,请大佬们指正,谢谢;
最佳答案
77_avatar_small
2020-2-18 16:50:13
我的观点跟楼主一致,赞同!




上一篇:winhttp的send问题
下一篇:VS2013的按钮
77_avatar_middle
最佳答案
24 
online_vip 发表于 2020-2-18 16:50:13 | 显示全部楼层    本楼为最佳答案   
我的观点跟楼主一致,赞同!
07_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-2-18 17:46:46 | 显示全部楼层
Health 发表于 2020-2-18 16:50
我的观点跟楼主一致,赞同!

多谢, 我个人感觉是这个样子的, 但是毕竟是小菜, 不敢保证是对的. 迷糊..
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-4-8 06:52

Powered by CcTry.CoM

© 2009-2020 cctry.com

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