在C中,我们可以使用块来限制变量的作用域,因此也是如此
{
int var = /* initialization */;
while(...) {
// some stuff with var
}
}
相当于
while(...) {
static int var = /* initialization */;
// some stuff with var
}
?
在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
对于整个程序,只有一个关键字为static
的变量实例,因此它由所有线程共享.