static 生命周期
作用域差异
int a = 0: 如果 a 是在函数内部声明的,那么 a 是一个局部变量,其作用域仅限于该函数内部。
static int a = 0: 如果 a 是在函数内部声明的,那么 a 仍然是一个局部变量,但其作用域被限制在声明它的源文件中,即它对其他源文件不可见。
生命周期变化
int a = 0: 局部变量的生命周期仅限于函数执行期间。每次函数调用时,a 都会被重新初始化为0,函数执行完毕后,a 就会被销毁。
static int a = 0: 静态局部变量的生命周期是整个程序的运行期间。第一次执行到 static int a = 0 时,a 会被初始化为0,之后即使函数执行完毕,a 的值也会被保留,下次函数调用时,a 会保持上次的值。
#include<stdio.h>
void example() {
int a = 0; // 局部变量
a++;
printf("a = %d\n", a);
}
void static_example() {
static int a = 0; // 静态局部变量
a++;
printf("static a = %d\n", a);
}
int main() {
example(); // 输出 a = 1
example(); // 输出 a = 1
static_example(); // 输出 static a = 1
static_example(); // 输出 static a = 2
return 0;
}
lambda表达式
int main(){
int a = 0; //非静态
auto pfn = [=]() mutable{ //值捕获
a++; //实际操作的只是a的一个副本 并非main函数中的a
};
pfn();
std::cout << a << std::endl; // 0 结果不会改变
}
int main() {
static int a = 0; // 静态局部变量 在函数的调用期间a的值会继续保持
auto pfn = [=]() mutable { // 值捕获
a++;
};
pfn(); // 调用 lambda 函数
std::cout << a << std::endl; // 1
pfn(); // 调用 lambda 函数
std::cout << a << std::endl; // 2
}
int main(){
static int a = 0;
// [a = a] 表示通过值捕获外部变量a的值并赋给了当前lamada内的a
// Lambda 表达式内部的 a 是外部 a 的一个拷贝
auto pfn = [a = a]() mutable{
a++; //不会影响外部的a
};
pfn();
std::cout << a << std::endl; // 0
}
//引用捕获会影响到lamada函数的外部
int main(){
int a = 0;
// [&] 捕获所有外部变量的引用 mutable关键字表示可以修改被捕获的变量的值
auto pfn = [&]() mutable{
a++;
};
pfn();
std::cout << a << std::endl; // 1
}
int main(){
static int a = 0;
auto pfn = [&]() mutable{
a++;
};
pfn();
std::cout << a << std::endl; // 1
}
int main(){
static int a = 0;
// [&a = a] 表示通过引用捕获外部变量a并赋给了当前lamada内的a
// Lambda 表达式内部的 a 是外部 a 的一个引用
auto pfn = [&a = a]() mutable{
a++; //影响外部的a
};
pfn();
std::cout << a << std::endl; // 1
}