函数中的静态int

时间:2013-05-02 19:21:18

标签: c++ function static

我遇到了这段代码:

void function(int nextFoo)
{
    static int lastFoo = nextFoo; 
    if (nextFoo != lastFoo) 
    {
         // is this possible?
    }
    lastFoo = nextFoo;
}

编码员认为lastFoo仅在第一次运行中设置,而最后一行是对的?我想(但不知道)if块中的代码永远不会运行,但无法找到验证。

5 个答案:

答案 0 :(得分:17)

  

编码器认为nextFoo仅在第一次运行中设置,而最后一行是对的?

是。 static局部变量只初始化一次(而不是每次输入函数时)。在C ++ 11中,这也保证以线程安全的方式发生。根据C ++ 11标准的第6.7 / 4段:

  

[...]如果控制进入   在初始化变量的同时声明,并发执行应该等待   完成初始化[...]

注意,如果static对象的初始化引发异常,则在下次输入function()时将重新尝试其初始化(在这种情况下不相关,因为初始化为int无法投掷)。从上面引用的同一段开始:

  

[...]如果初始化通过抛出异常退出,则初始化   未完成,因此下次控制进入声明时将再次尝试。 [...]

答案 1 :(得分:4)

当然有可能。静态初始化仅发生一次。下次调用该函数时,不再执行初始化。

(事实上,初始化甚至没有种族: - )。)

答案 2 :(得分:3)

中的代码可以运行;以下示例打印hello

#include <iostream>

using namespace std;

void function(int nextFoo)
{
    static int lastFoo=nextFoo; 
    if (nextFoo!=lastFoo) 
    {
        cout << "hello" << endl;
    }
    lastFoo=nextFoo;
}

int main()
{
    function(1);
    function(2);

    return 0;
}

答案 3 :(得分:1)

简单的答案是,lastFoo只会在这里第一次设置:

static int lastFoo=nextFoo;

但这足以作为一个测试,以了解它如何为自己工作。当然,函数lastFoo的末尾将由最终赋值设置:

#include <iostream>

void function(int nextFoo)
{
    static int lastFoo=nextFoo; 

    std::cout << "lastFoo: " << lastFoo << std::endl ;

    if (nextFoo!=lastFoo) 
    {
         std::cout << "here" << std::endl ;
    }
    lastFoo=nextFoo;
}

int main()
{
    function(10) ;
    function(11) ;

}

答案 4 :(得分:0)

静态是一个存储类,它告诉编译器该变量不是每次输入和离开函数时都会创建/销毁的自动变量。

来自K&amp; R C编程语言(第2版)

  

A4.1存储类

     

有两个存储类:自动和静态

     

...

     

静态对象可以是块的本地对象,也可以是所有块的外部对象,但是   在任何一种情况下都保留它们的值,从退出和重新进入函数和块。

所以是的,if声明是完全合法的。当再次调用该函数时,该变量可能具有不同的值。