为何子进程重新声明同名变量后仍保留旧变量值?
为什么输出中的a值始终是3而不是0?
先看你提供的代码:
#include <iostream> #include <unistd.h> using namespace std; int main() { int a = 3; for (int i = 0; i < 3; ++i) { cout << getpid() << " " << a << endl; int a = 0; if (fork() == 0) { continue; } break; } wait(0); exit(0); }
输出结果:
11470 3
11471 3
11472 3
核心原因有两点:
变量作用域规则限制:
循环体里的int a = 0;是在cout语句之后定义的局部变量,根据C++的作用域规则,变量在定义位置之前是不可见的。所以cout << ... << a << endl;访问的是外层(main函数内)定义的int a = 3;,而非循环内的局部a。fork的执行逻辑不影响cout的取值:
fork()是在循环内的局部a定义之后调用的,但此时父进程和子进程复制的内存状态里,局部a的作用域仅到当前循环体结束。子进程执行continue回到循环开头后,会进入新的迭代,此时又会从cout语句开始执行,依然访问外层的a=3,循环内的局部a会被重新定义,但始终在cout之后,不会影响cout的输出值。
简单来说:所有打印操作都发生在循环内的局部a定义之前,因此永远只会输出外层a的初始值3。
内容的提问来源于stack exchange,提问作者Claude Li
相关产品推荐
相关产品推荐

