C++函数内static变量赋值为何未生效?求技术解析
问题:static局部变量赋值为何只生效一次?
static_outer的表现符合预期:调用print_str()函数时,static_outer会被赋予参数的值并输出。
而static_inner的表现却不符合预期:首次调用函数时它被赋予参数值,但第二次调用时,输出值仍与首次相同。
为何该赋值操作无法改变它的值?直觉是该行赋值因static_inner已被声明而被忽略,但编译器并未报错。
代码及输出如下:
static const char* static_outer; void print_str(const char* const str) { static const char* static_inner = str; cout << static_inner << "\r\n"; static_outer = str; cout << static_outer << "\r\n"; } int main() { const char str1[] = "Foo"; const char str2[] = "Bar"; cout << "First call" << "\r\n"; print_str(str1); cout << "\r\n" << "Second call" << "\r\n"; print_str(str2); } // Output: // First call // Foo // Foo // // Second call // Foo <--- 此处为何不是"Bar"? // Bar
原因解释
这是C++中static局部变量的初始化规则导致的:
- 函数内的
static const char* static_inner = str;不是普通赋值,而是初始化语句。static局部变量的初始化只会在第一次进入函数时执行一次,后续调用函数时,这条初始化代码会被直接跳过,变量会保留之前的取值。 - 全局的
static_outer则是每次调用函数时执行static_outer = str;这个普通赋值操作,所以每次调用都会更新它的值。
修正方法
如果需要每次调用都更新static_inner的值,要把声明和赋值分开:
void print_str(const char* const str) { static const char* static_inner; // 仅声明,默认初始化为nullptr static_inner = str; // 每次调用都会执行赋值 cout << static_inner << "\r\n"; static_outer = str; cout << static_outer << "\r\n"; }
内容的提问来源于stack exchange,提问作者Lukáš Řádek
相关产品推荐
相关产品推荐

