静态作用域和动态作用域的区别
The difference between static scope and dynamic scope
我的老师提供了以下伪代码,并说使用静态范围的输出是1 2 3
,但是使用动态范围的输出是2 3 4
。
挑战是在静态范围内我们使用 a=1、b=2、c=3 而不注意 main 或 no,使用 a=1、b=2、c=4?仅在静态范围内,不包括 C 规则。
void fun1(void);
void fun2(void);
int a=1, b=2, c=3;
int main() {
c=4;
fun1();
return 0;
}
void fun1() {
int a=2, b=3;
fun2();
}
void fun2(){
printf("%d%d%d", a,b,c);
}
如果 动态作用域在 C 中是可能的,那么在 [=16] 中查找变量 a
、b
和 c
=] 将使用动态环境。
这又取决于函数的实际调用方式。由于它是从 fun1
调用的,因此将使用该范围的变量绑定(因此 a = 2
和 b = 3
)。因为 fun1
是从 main
调用的,它设置了绑定 c = 4
,输出将是 2 3 4
.
另一个例子:
void fun1(void);
void fun2(void);
void fun3(void);
int a=1, b=2, c=3;
int main()
{
c=4;
fun1();
int a = 21;
fun3();
return 0;
}
void fun1()
{
int a=2, b=3;
fun2();
}
void fun2()
{
printf("%d %d %d\n", a,b,c);
}
void fun3() {
int c = 42;
fun2();
}
会打印
2 3 4
21 2 42
也许实际看到差异对您有帮助。 Clojure 支持动态和词法作用域(这是正确的术语,顺便说一句):
(def static-scoped 21)
(def ^:dynamic dynamic-scoped 21)
(defn some-function []
(println "static = " static-scoped)
(println "dynamic = " dynamic-scoped))
(defn other-function []
(binding [dynamic-scoped 42]
(println "Established new binding in dynamic environment")
(some-function)))
;; Trying to establish a new binding for the static-scoped
;; variable won t affect the function defined
;; above.
(let [static-scoped 42]
(println "This binding won't affect the variable resolution")
(other-function))
(println "calling some-function directly")
(some-function)
请注意,Clojure 尽量做到纯函数式,因此上面代码的 none 是一个赋值(换句话说:变量的值一旦赋值就不会被修改)
我的老师提供了以下伪代码,并说使用静态范围的输出是1 2 3
,但是使用动态范围的输出是2 3 4
。
挑战是在静态范围内我们使用 a=1、b=2、c=3 而不注意 main 或 no,使用 a=1、b=2、c=4?仅在静态范围内,不包括 C 规则。
void fun1(void);
void fun2(void);
int a=1, b=2, c=3;
int main() {
c=4;
fun1();
return 0;
}
void fun1() {
int a=2, b=3;
fun2();
}
void fun2(){
printf("%d%d%d", a,b,c);
}
如果 动态作用域在 C 中是可能的,那么在 [=16] 中查找变量 a
、b
和 c
=] 将使用动态环境。
这又取决于函数的实际调用方式。由于它是从 fun1
调用的,因此将使用该范围的变量绑定(因此 a = 2
和 b = 3
)。因为 fun1
是从 main
调用的,它设置了绑定 c = 4
,输出将是 2 3 4
.
另一个例子:
void fun1(void);
void fun2(void);
void fun3(void);
int a=1, b=2, c=3;
int main()
{
c=4;
fun1();
int a = 21;
fun3();
return 0;
}
void fun1()
{
int a=2, b=3;
fun2();
}
void fun2()
{
printf("%d %d %d\n", a,b,c);
}
void fun3() {
int c = 42;
fun2();
}
会打印
2 3 4
21 2 42
也许实际看到差异对您有帮助。 Clojure 支持动态和词法作用域(这是正确的术语,顺便说一句):
(def static-scoped 21)
(def ^:dynamic dynamic-scoped 21)
(defn some-function []
(println "static = " static-scoped)
(println "dynamic = " dynamic-scoped))
(defn other-function []
(binding [dynamic-scoped 42]
(println "Established new binding in dynamic environment")
(some-function)))
;; Trying to establish a new binding for the static-scoped
;; variable won t affect the function defined
;; above.
(let [static-scoped 42]
(println "This binding won't affect the variable resolution")
(other-function))
(println "calling some-function directly")
(some-function)
请注意,Clojure 尽量做到纯函数式,因此上面代码的 none 是一个赋值(换句话说:变量的值一旦赋值就不会被修改)