關于此代碼:
#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()這里作業,哪個答案是正確的?
非常感謝!
uj5u.com熱心網友回復:
唯一被列印的是x在main定義的最外層范圍內。它是 1,所以只列印“1”,由創建的四個行程中的每一個列印一次。
在內部塊內部,int x = …;創建一個與外部不同的新物件,x即使它們具有相同的名稱。這些物件不列印,因此它們的值無關緊要。
更詳細地說,在int x = x 1;初始化x器中,初始化器中的 是指x被宣告的物件,因此該定義嘗試在其自己的初始化中使用該物件。C 標準沒有定義這種行為,1因此標準允許程式在這里嚴重誤入歧途。然而,典型的編譯器在這里實作了一些簡單的代碼,要么忽略初始化,因為它本質上沒有意義,要么實作x 1使用恰好已經在為 new 分配的記憶體中的任何位x。int x = 4 * x;有同樣的問題。
腳注
1由于 C 2018 6.3.2.1 2,它表示當使用地址未被獲取的未初始化自動物件的值時,行為未定義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/456472.html
上一篇:逐行讀取檔案并匹配模式-C
