在 C 中我们可以使用块来限制变量的范围,所以
{
int var = /* initialization */;
while(...) {
// some stuff with var
}
}
相当于
while(...) {
static int var = /* initialization */;
// some stuff with var
}
?
没有。
带有
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++ );
}
<source>: In function 'main':
<source>:18:24: error: initializer element is not constant
18 | static int var = f();
|
带有
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++ );
}
}
3
4
3
4
--
3
4
5
6