我遇到了这段代码:
void function(int nextFoo)
{
static int lastFoo = nextFoo;
if (nextFoo != lastFoo)
{
// is this possible?
}
lastFoo = nextFoo;
}
编码员认为lastFoo
仅在第一次运行中设置,而最后一行是对的?我想(但不知道)if块中的代码永远不会运行,但无法找到验证。
答案 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
声明是完全合法的。当再次调用该函数时,该变量可能具有不同的值。