Re: [問題] 一個基礎程式語言問題

看板Programming作者 (堅持阿伏哥聯盟)時間13年前 (2011/03/14 13:38), 編輯推噓12(12010)
留言22則, 3人參與, 最新討論串2/2 (看更多)
今天跟別人討論一下, 既然板上沒人回答, 我就自問自答, 也許有人有興趣可以討論 @@ 有可能是這樣的情況... 因為 Dynamic scoping 會去抓最後一個 declare 的變數去作定義. 所以在 foo() 下執行 bar() 會形成把 foo() 裡的 M 拉進 bar() 的 scope 下, 並定義為 50 的情況, 導致在 print 的時候 foo() 下面看不到 local 的 M, 於是從 global 裡找了 M 來印出 M=30 ※ 引述《arcred (堅持阿伏哥聯盟)》之銘言: : 有個題目看了半天實在想不出答案為什麼是這樣... : 想請板上大大幫忙解答 : int N = 20 : int M = 30 : procedure foo() : int M = N : int N = 40 : bar() : print M,N : procedure bar() : M = 50 : 問在 dynamic scoping + define-anywhere + whole-block-scope : 的情況下, 執行了 foo() 之後會印出什麼東西, 或是哪裡會產生錯誤. : 答案是 30, 40 (M=30, N=40) : 實在想不透為什麼啊...如果是印foo圈內的M : 應該被指定成 M =N =20了 (還是會變成40? 因為是define-anywhere) : 就算不是, 執行過 bar() 之後, 全域的 M應該也變成 50了才對呀... : 那30到底是怎麼印出來的呢? : 付上其他題答案參考 : static scoping+declare-before-use+declartion-to-end-of-block-scope: M=20,N=40 : static scoping+declare-before-use+whole-block-scope: illegal at "int M=N" : static scoping+declare-anywhere+whole-block-scope: M=40, N=40 : 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 68.98.169.112

03/14 22:39, , 1F
這個解釋合理. 書上有例子說foo是外層M的
03/14 22:39, 1F

03/14 22:40, , 2F
scope,按照同樣模式,bar就是foo內M的scope
03/14 22:40, 2F

03/14 22:41, , 3F
該去看一點C#和Python來核對何謂whole-block
03/14 22:41, 3F

03/14 22:41, , 4F
scope了.
03/14 22:41, 4F

03/14 22:56, , 5F
多謝你的回應~請問你看的是哪本呢?能參考嗎
03/14 22:56, 5F

03/14 23:13, , 6F
我google查到跟你看的一樣的書,就看看了.
03/14 23:13, 6F

03/14 23:13, , 7F
目前google以上關鍵詞查到的來源還真少.
03/14 23:13, 7F

03/16 07:40, , 8F
等一下, dynamic scoping 會把 calling
03/16 07:40, 8F

03/16 07:41, , 9F
stack caller 層中最近的那個 "偷走" 導致
03/16 07:41, 9F

03/16 07:42, , 10F
該層的該變數變為不可見. dynamic scoping
03/16 07:42, 10F

03/16 07:42, , 11F
有 "偷走" 這種狀況喔 @@?
03/16 07:42, 11F

03/16 07:47, , 12F
ok, 我看懂了. 是說 global 的 M=30 因為
03/16 07:47, 12F

03/16 07:48, , 13F
是 whole-block-scope, 所以 bar 的 M
03/16 07:48, 13F

03/16 07:48, , 14F
不算是未定義, 這時這個廣域 M 算是 stack
03/16 07:48, 14F

03/16 07:49, , 15F
中最近的 M. 好壞的題目 @@
03/16 07:49, 15F

03/16 10:51, , 16F
我不確定答案是不是這樣啦, 只是我的猜想
03/16 10:51, 16F

03/16 10:52, , 17F
教授給了錯的答案也是有可能的 @@
03/16 10:52, 17F

03/16 10:53, , 18F
只是我寫信問他一直沒回, 在放春假中= =
03/16 10:53, 18F

03/16 11:09, , 19F
看起來 whole-block + dynamic-scoping
03/16 11:09, 19F

03/16 11:10, , 20F
= 先依 lexicon-scoping 做 binding
03/16 11:10, 20F

03/16 11:10, , 21F
找不到再使用 dynamic-scoping
03/16 11:10, 21F

03/17 13:32, , 22F
(錯字, lexic"al" scoping 才對 >///<)
03/17 13:32, 22F
文章代碼(AID): #1DVQdBXQ (Programming)
文章代碼(AID): #1DVQdBXQ (Programming)