在C中我们可以使用块来限制变量的范围,所以
{
int var = /* initialization */;
while(...) {
// some stuff with var
}
}
Run Code Online (Sandbox Code Playgroud)
相当于
while(...) {
static int var = /* initialization */;
// some stuff with var
}
Run Code Online (Sandbox Code Playgroud)
?
不。
带有static关键字的初始值设定项必须是常量。
{
int var = f();
for ( int j=0; j<2; ++j ) {
printf( "%d\n", var++ );
}
}
printf( "--\n" );
for ( int j=0; j<2; ++j ) {
static int var = f();
printf( "%d\n", var++ );
}
Run Code Online (Sandbox Code Playgroud)
<source>: In function 'main':
<source>:18:24: error: initializer element is not constant
18 | static int var = f();
|
Run Code Online (Sandbox Code Playgroud)
带static关键字的在程序运行期间一直存在,无论代码执行多少次,它都只会被初始化一次。如果该代码块位于多次执行的循环中或多次调用的函数中,则它不会按照期望的频率进行初始化。
for ( int i=0; i<2; ++i ) {
int var = 3;
for ( int j=0; j<2; ++j ) {
printf( "%d\n", var++ );
}
}
printf( "--\n" );
for ( int i=0; i<2; ++i ) {
for ( int j=0; j<2; ++j ) {
static int var = 3;
printf( "%d\n", var++ );
}
}
Run Code Online (Sandbox Code Playgroud)
3
4
3
4
--
3
4
5
6
Run Code Online (Sandbox Code Playgroud)
static整个程序中只有一个带有关键字的变量实例,因此它被所有线程共享。