代码之家  ›  专栏  ›  技术社区  ›  alandawkins

当今主流编程语言主要使用动态或静态(词法)作用域吗?

  •  0
  • alandawkins  · 技术社区  · 7 年前

    我读过 this 我想我已经理解了最上等的答案,但他说

    因为现在广泛使用的每种编程语言基本上都使用 词法范围界定

    我也从 coursera programming language ,但这里有一个简单的C代码:

    #include <stdio.h>
    
    int x = 1;
    
    void fun(){
        printf("%d\n", x);
    }
    
    void dummy1(){
        x = 2;
        fun();
    }
    
    void dummy2(){
        x = 3;
        fun();
    }
    
    
    int main(){
    
        x = 4;
    
        fun();
        dummy1();
        dummy2();
    
        return 0;
    }
    

    输出:

    4
    2
    3
    

    C++有完全相同的行为,所以我认为C和C++是动态范围语言,是吗?大多数编程语言都使用静态作用域,这是真的吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Kevin    7 年前

    您拥有的不是动态范围界定。您没有引入任何新变量,而是使用相同的全局变量。如果C和C++具有动态作用域,那么 x 是新变量):

    #include <stdio.h>
    
    int x = 1;
    
    void fun(){
        printf("%d\n", x);
    }
    
    void dummy1(){
        int x = 2;
        fun();
    }
    
    void dummy2(){
        int x = 3;
        fun();
    }
    
    
    int main(){
    
        int x = 4;
    
        fun();
        dummy1();
        dummy2();
    
        return 0;
    }
    

    将输出

    4
    2
    3
    

    但是相反 it outputs

    1
    1
    1
    

    自从 fun() 始终使用相同的全局 x个 已初始化为1。这是因为C和C++使用静态词法作用域。