zoukankan      html  css  js  c++  java
  • 全局函数中的static变量问题

    现有:
    //teststatic.cpp

    void TestStatic(int nCopy)
    {
       static int a = nCopy;
       cout << a << endl;
    }

    int main()
    {
       TestStatic(1);
       TestStatic(2);
    }

    结果:
    1
    1
    press any key to continue

     问题是:为什么这样的结果??

     回复内容
    【taodm】:
    static变量就这样的啊,只初始化一次。

    【lj860603】:
    static还有全局变量只能定义一次,初始化一次

    【Chiyer】:
    那你要什么样子

    static 只在调用第一次的时候初始化

    所以

       TestStatic(1);     // 这个函数初始化a 为1
       TestStatic(2);    // 这次调用就不用初始化了

    你调换一下顺序就知道了

     TestStatic(2);   
       TestStatic(1);

    结果应该是 
    2
    2    



    【todototry】:
    static变量初始化了之后,再次进入函数的时候,保持原的值的

    【guangmingshizhe】:
    static变量只定一一次,但是可以重新赋值


    static int test = 10;

    void TestStatic(int nCopy)
    {
    test = nCopy;
    cout << test << endl;
    }


    TestStatic(20);
    TestStatic(30);

    结果就是20  30

    【eduyu】:
    void TestStatic(int nCopy)
    {
       static int a = nCopy;  //这句话是初始化,不是赋值,由于static变量只能被赋值一次
                              //第二次进入这个函数,这句话可以认为“不会被执行”。

       //加这句,这句话是赋值,每次进入这个函数都会被执行。
       a=nCopy;

       cout << a << endl;
    }

    int main()
    {
       TestStatic(1);
       TestStatic(2);
    }

    【eduyu】:
    抱歉,打快了,不是被“赋值一次”是 “被初始化一次”。

    ok,你再看看结果。

    【yuyunliuhen】:
    static只能初始化一次

    【erac】:
    static初始化一次,如果不对其进行修改还是原来的值。

    【clxye】:
    恩,这个问题问的好。学习了。

    【jsjszg】:
    对的.虽然调试的时候每次都经过初始化那一行,但并没有初始化.(除了第一次)

    【Aaron_Jerry】:
    TestStatic(1);
    TestStatic(2);
    输出的是同一个内存地址里的值

    具体见:
    http://dev.csdn.net/author/haoel/f10d3532658744ab87e4d4a000091b81.html

    【Vitin】:
    简单地说,应该这样写:
    void TestStatic(int nCopy)
    {
       static int a;
       a = nCopy;
       cout << a << endl;
    }


    【qwerasd1234】:
    void TestStatic(int nCopy)
    {
       static int &a = nCopy;
       cout << a << endl;
    }

    int main()
    {
       TestStatic(1);
       TestStatic(2);
       return 0;
    }
  • 相关阅读:
    BZOJ 2818 Gcd 线性欧拉筛(Eratosthenes银幕)
    simlescalar CPU模拟器源代码分析
    基于webRTC技术 音频和视频,IM解
    SVM明确的解释1__ 线性可分问题
    Atititjs javascript异常处理机制java异常转换.js exception process
    hibernate annotation 相关主键生成策略
    切向量,普通矢量,渐变
    C++动态数组简单的模拟二元堆
    [Angular] Create a custom validator for reactive forms in Angular
    [RxJS] Marbles Testings
  • 原文地址:https://www.cnblogs.com/carbs/p/2440531.html
Copyright © 2011-2022 走看看