2009-11-18 38 views
26

Tôi đã cố gắng để có được đầu của tôi xung quanh ràng buộc nông và sâu ràng buộc, wikipedia không làm một công việc tốt để giải thích nó đúng cách. Nói rằng tôi có đoạn mã sau, điều gì sẽ đầu ra được nếu ngôn ngữ sử dụng Phạm vi năng động vớiPhạm vi động - Ràng buộc sâu và Liên kết nông

a) sâu ràng buộc

b) nông ràng buộc?

x: integer := 1 
y: integer := 2 

procedure add 
    x := x + y 

procedure second(P:procedure) 
    x:integer := 2 
    P() 

procedure first 
    y:integer := 3 
    second(add) 

----main starts here--- 
first() 
write_integer(x) 
+0

là Python này? ngôn ngữ câu hỏi của bạn là gì? vui lòng chỉ định – Shimmy

Trả lời

25

Sâu ràng buộc liên kết với môi trường đồng thời các thủ tục được thông qua như là một cuộc tranh cãi

nông ràng buộc liên kết với môi trường đồng thời các thủ tục được thực sự gọi là

Vì vậy, đối Phạm vi năng động với sâu ràng buộc khi thêm được chuyển vào thứ hai môi trường là x = 1, y = 3 và x là x toàn cầu, vì vậy nó viết 4 vào x toàn cục, là ký tự được chọn bởi write_integer.

nông ràng buộc chỉ đi qua cho đến khi nó tìm thấy biến gần tương ứng với tên cái câu trả lời sẽ là 1.

+2

Đối với ràng buộc nông, nếu tôi đã đặt "write_integer (y)" bên trong thủ tục thứ hai (trước khi P()) tôi sẽ nhận được 3 hoặc 2? Ngoài ra cho ràng buộc nông, tôi có thể không thay đổi giá trị của một biến toàn cầu? – vvMINOvv

+1

Phạm vi động với ranh giới nông sẽ in "5". Điều này là do phạm vi động sử dụng các kết buộc (các kết hợp biến-giá trị) từ phương thức mà nó được gọi từ đó. Vì vậy, phạm vi động với ràng buộc nông sẽ sử dụng liên kết 'x = 2', không giống như phạm vi động với liên kết sâu sẽ sử dụng (như @ jjia6395 đã nói)' x = 1' (ràng buộc từ khi 'add' được chuyển vào phương thức 'giây' làm tham số). –

+0

@AntoineDahan không nếu 'second' tự động giới thiệu ràng buộc mới cho biến mới xảy ra với tên' x' (hiển nhiên bằng cách sử dụng 'x: integer: = 2' thay vì' x: = 2'), do đó 'add' (được gọi từ' second', trong khi 'second' còn sống) các thay đổi được tạo động' x' thành 5. Nhưng 'write_integer (x)' tham chiếu đến 'x' toàn cục. Vì vậy, mã giả này là gây hiểu nhầm. nó nên đã sử dụng "=" trong các định nghĩa, như 'x: integer = 1' và": = "trong việc chuyển đổi các phép gán, như' x: = x + y'. –

Các vấn đề liên quan