fork() 在这个例子中是如何工作的?
How does fork() works in this example?
关于此代码:
#include <stdio.h>
int main(){
int x = 1;
if (0 == fork()){
int x = x + 1;
fork();
}
else{
int x = 4 * x;
fork();
}
printf("%d",x);
}
我的一些朋友告诉我结果应该是 2244
,但是当我尝试 运行 时,我得到 1111
。
你能帮我理解fork()
在这里是如何工作的吗?哪个答案是正确的?
非常感谢!
唯一打印的是 main
定义最外层范围内的 x
。它是 1,所以只打印“1”,创建的四个进程各打印一次。
在内部块中,int x = …;
创建了一个与外部 x
不同的新对象,即使它们具有相同的名称。这些对象未打印,因此它们的值无关紧要。
更详细地说,在int x = x + 1;
中,初始化器中的x
指的是被声明的x
,所以这个定义试图在它自己的初始化中使用该对象。此行为未由 C 标准定义,1 因此标准允许该程序在此处严重误入歧途。然而,典型的编译器在这里实现了一些简单的代码,或者忽略初始化,因为它本质上是没有意义的,或者使用恰好已经在为新 x
分配的内存中的任何位来实现 x + 1
。 int x = 4 * x;
有同样的问题
脚注
1 由于 C 2018 6.3.2.1 2,它表示当使用未获取地址的未初始化自动对象的值时,行为未定义。
关于此代码:
#include <stdio.h>
int main(){
int x = 1;
if (0 == fork()){
int x = x + 1;
fork();
}
else{
int x = 4 * x;
fork();
}
printf("%d",x);
}
我的一些朋友告诉我结果应该是 2244
,但是当我尝试 运行 时,我得到 1111
。
你能帮我理解fork()
在这里是如何工作的吗?哪个答案是正确的?
非常感谢!
唯一打印的是 main
定义最外层范围内的 x
。它是 1,所以只打印“1”,创建的四个进程各打印一次。
在内部块中,int x = …;
创建了一个与外部 x
不同的新对象,即使它们具有相同的名称。这些对象未打印,因此它们的值无关紧要。
更详细地说,在int x = x + 1;
中,初始化器中的x
指的是被声明的x
,所以这个定义试图在它自己的初始化中使用该对象。此行为未由 C 标准定义,1 因此标准允许该程序在此处严重误入歧途。然而,典型的编译器在这里实现了一些简单的代码,或者忽略初始化,因为它本质上是没有意义的,或者使用恰好已经在为新 x
分配的内存中的任何位来实现 x + 1
。 int x = 4 * x;
有同样的问题
脚注
1 由于 C 2018 6.3.2.1 2,它表示当使用未获取地址的未初始化自动对象的值时,行为未定义。