Nội dung text [HK222] Một số câu hỏi ôn tập (chưa ôn trên lớp).docx
1. Deep and shallow binding Giải: Static-scope + deep binding - Bài toán bắt đầu với câu lệnh gọi SUB1. - Khi sub2 được gọi tại dòng SUB2(2,3,FUNC) và đi vào trong môi trường SUB2 , x = 2; y = 3. - Z = |x – y| = 1; x=2 , y=3 - Z = (F(x) + F(y))* Z / 2 , x = 2, y = 3, z = 2 Hàm F(2) được gọi với V = 2 ; X = 4 ; Y = 2. Trong hàm này, X, Y là các biến toàn cục. Giá trị X = 4 được lấy ở hàm main, giá trị Y bằng 2 được lấy tại SUB1. Khi đó, F(2) = 2*4 + 2 = 10 ; F(Y) được gọi với V = 3 ; X = 4; Y = 2 và F(3) = 3*4 + 2 = 14 Z = [ F(2) + F(3) ] * 1 / 2 = 12. Dynamic scope + shallow binding. - Bài toán bắt đầu với câu lệnh gọi SUB1. - Khi sub2 được gọi tại dòng SUB2(2,3,FUNC) và đi vào trong môi trường SUB2, , x = 2; y = 3. Hàm f(2) được gọi. Trong môi trường của f(2), ta có v = 2, x = 2, y = 3 . 2*2 + 3= 7 - Hàm f(3) được gọi. Trong ……….., ta có v= 3, x= 2, y= 3. - 3*2 + 3 = 9 Vậy ( F(2) + F(3) ) *1 / 2 = 8. function f1() { var x = 10; // shallow binding function f2(fx) { var x; x = 6; // deep binding. fx();
}; function f3() { print x; }; f2(f3); }; Deep/shallow binding makes sense only when a procedure can be passed as an argument to a function. Deep binding binds the environment at the time a procedure is passed as an argument. Shallow binding binds the environment at the time a procedure is actually called. Deep binding. Here f3() gets the environment of f1() and prints the value of x as 10 which is local variable of f1(). Shallow binding. f3() is called in f2() and hence gets the environment of f2() and prints the value of x as 6 which is local to f2() 2. Short-circuit Short-circuit evaluation: Nếu vế đầu tiên của toán hạng là đúng thì bỏ qua vế kia. Trong C, toán tử == và && có độ kết hợp trái. Đặt (1) là biểu thức (x=2) == 2 , (2) là (x=3)==4 , (3) là (x=3) == 3. Ở (x=2) ==2. Ta gán x = 2 , x = 2 trả về 2. 2 == 2 -> true. Nguyên biểu thức trả về true. X lúc này mang giá trị x = 2. Ở (x=3) == 4. Ta gán x = 3, x = 3 trả về 3. 3 khác 4 -> False. Nguyên biểu thức trả về false. X lúc này mang giá trị 3. (1) && (2) . Nếu (1) true mà (2) false thì (1) && (2) false. Khi đó, dù (3) true or false thì biểu thức tổng cũng đều là false. Quá trình xét dừng lại tại đây. Chọn C. 3. Ứng dụng về các cơ chế gọi chương trình con (Lưu ý: phải học thêm kết hợp với Python) 4. Hiện thực con trỏ hàm trong các ngôn ngữ lập trình đã học (C++/ Python) Hãy viết tương đương đoạn mã sau đây trong Python: void fun(int a) { printf("Value of a is %d\n", a);
} int main() { // fun_ptr is a pointer to function fun() void (*fun_ptr)(int) = &fun; /* The above line is equivalent of following two void (*fun_ptr)(int); fun_ptr = &fun; */ // Invoking fun() using fun_ptr (*fun_ptr)(10); return 0; } 5. Python variable scope with nonlocal, global def outer_function(): global_var = "I'm a global variable" def inner_function1(): nonlocal_var = "I'm a nonlocal variable" print("Inner Function 1 - Before Modification") print("Global variable:", global_var) print("Nonlocal variable:", nonlocal_var) def inner_function2(): nonlocal nonlocal_var nonlocal_var = "Modified nonlocal variable in inner_function2" global nonlocal_var_global nonlocal_var_global = "I'm a global variable accessed in inner_function2" inner_function2() print("\nInner Function 1 - After Modification") print("Global variable:", global_var) print("Nonlocal variable:", nonlocal_var) print("Nonlocal variable (global):", nonlocal_var_global) inner_function1() print("\nOuter Function") print("Global variable:", global_var) outer_function() Trong ví dụ này, chúng ta có một outer_function chứa hai hàm lồng nhau: inner_function1 và inner_function2. Đây là cách code hoạt động: 1. outer_function được định nghĩa và khởi tạo biến global_var là biến cục bộ.
2. inner_function1 được định nghĩa bên trong outer_function và khởi tạo biến nonlocal_var là biến cục bộ. Sau đó, nó in ra các giá trị của global_var và nonlocal_var trước khi thay đổi. 3. inner_function2 được định nghĩa bên trong inner_function1. Nó sử dụng từ khóa nonlocal để thay đổi biến nonlocal_var và từ khóa global để truy cập đến biến toàn cục mới được gọi là nonlocal_var_global. 4. inner_function2 được gọi từ inner_function1. 5. Sau khi inner_function2 thay đổi các biến, inner_function1 in ra các giá trị của global_var, nonlocal_var, và nonlocal_var_global. 6. Cuối cùng, outer_function in ra giá trị của global_var. Kết quả khi chạy code: Inner Function 1 - Before Modification Global variable: I'm a global variable Nonlocal variable: I'm a nonlocal variable Inner Function 1 - After Modification Global variable: I'm a global variable Nonlocal variable: Modified nonlocal variable in inner_function2 Nonlocal variable (global): I'm a global variable accessed in inner_function2 Outer Function Global variable: I'm a global variable 6. Một số hiện thực về kiểu: 6.1. Kiểu tập hợp Xem x là một biến thuộc loại tập hợp "tập hợp từ 5 đến 20" được thể hiện dưới dạng một chuỗi bit, trong đó 5 tương ứng với bit có giá trị thấp nhất và 20 tương ứng với bit có giá trị cao nhất. Cho x = {6, 7, 8}, giá trị số nguyên tương ứng của x khi được ép kiểu thành kiểu số nguyên là gì? 7. Truyền tham số trong C++: Hãy cho biết kết quả của đoạn mã này và giải thích: #include <iostream> void modifyPointer(int* ptr) { ptr = new int; *ptr = 100; } void modifyReference(int& ref) { int* ptr = new int; *ptr = 200; ref = *ptr; } int main() { int value1 = 50; int* ptr1 = &value1; modifyPointer(ptr1); int value2 = 50; int& ref = value2; modifyReference(ref);