[問題] block和local variable的scope?

看板C_and_CPP (C/C++)作者 (人生啊)時間16年前 (2010/03/10 12:58), 編輯推噓11(11014)
留言25則, 9人參與, 最新討論串1/1
請問一下 這段程式碼 int num = 10; int i; for(i = 0; i < 100; i++) { int num = 20; // ... } printf("%d", num); 我在良葛格網站看到 for block的num會"暫時"覆蓋local num 想請問一下何謂暫時覆蓋?? 因為print出來的值是10 搞不太懂 這兩個宣告是共用同一塊記憶體嗎?? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 163.29.38.58

03/10 13:03, , 1F
大括弧中宣告的變數 離開大括弧就會釋放掉 好像是這樣....
03/10 13:03, 1F

03/10 13:19, , 2F
覆蓋指的是「名字」覆蓋 記憶體是分開的
03/10 13:19, 2F

03/10 13:22, , 3F
如果記憶體是分開 那為何會覆蓋名字??
03/10 13:22, 3F

03/10 13:23, , 4F
就像兩張牌疊在一起 你只會看到最上面那張
03/10 13:23, 4F

03/10 13:23, , 5F
兩個num是獨立的記憶體空間, 但是在for block裡, 因為
03/10 13:23, 5F

03/10 13:24, , 6F
block頭有宣告自己的num, 所以for block內的num會暫時
03/10 13:24, 6F

03/10 13:25, , 7F
覆蓋原本for外面的num.
03/10 13:25, 7F

03/10 13:25, , 8F
即, 假設for外的num在0x1000, for內的在0x1008, 那麼在
03/10 13:25, 8F

03/10 13:26, , 9F
for內如果用到num變數, 拿到的是0x1008裡的值; 其不會影
03/10 13:26, 9F

03/10 13:26, , 10F
想for外的num(0x1000)裡的值, 所以外面的printf總是印
03/10 13:26, 10F

03/10 13:26, , 11F
出10.
03/10 13:26, 11F

03/10 13:27, , 12F
這裡的覆蓋不是指記憶體或資料, 而像是當妳喊了一聲num,
03/10 13:27, 12F

03/10 13:27, , 13F
這時候回應你的是0x1008的num, 而不是0x1000的num.
03/10 13:27, 13F

03/10 13:29, , 14F
那這種情況用"暫時覆蓋"形容好嗎?? 還是有其他的term
03/10 13:29, 14F

03/10 13:30, , 15F
還有Java也是這種處理方式嗎?
03/10 13:30, 15F

03/10 13:49, , 16F
正式的術語/word可能要直接查C/C++的spec吧....:)
03/10 13:49, 16F

03/10 16:28, , 17F
推兩張牌疊在一起, java也是這樣
03/10 16:28, 17F

03/10 16:54, , 18F
那為什麼在//那行print(num) 印不出東西來?
03/10 16:54, 18F

03/10 16:58, , 19F
可以吧?? 會印出20吧@_@"
03/10 16:58, 19F

03/10 17:01, , 20F
@@~我搞錯了 sorry
03/10 17:01, 20F

03/10 17:02, , 21F
這種屏蔽作用好像聽過有人叫他 shadow
03/10 17:02, 21F

03/10 18:23, , 22F
omg Koenig Lookup problem :3
03/10 18:23, 22F

03/11 00:39, , 23F
如果是以omni的compiler,裡面的num為blocklist底下的ident
03/11 00:39, 23F

03/11 01:31, , 24F
你可以想像成一顆高麗菜有好幾層"皮" 雖然都是皮...
03/11 01:31, 24F

03/11 01:32, , 25F
但外面的"皮"和裡面的"皮"是不同的"皮"...XD
03/11 01:32, 25F
文章代碼(AID): #1BboS5Fr (C_and_CPP)
文章代碼(AID): #1BboS5Fr (C_and_CPP)