2016-03-03 157 views
0

作用域如何与变量声明,初始化和赋值交互?基于我到目前为止了解到这些术语的定义列举如下:编程基础:变量声明,初始化,赋值和范围

  • 声明:美国一个变量的类型,它的名称/标识符。变量必须先被声明,然后才能分配或读取。

  • 赋值:抛出变量的现有值并将其替换为新值,旧值在赋值语句结束时丢弃,因此可以增加或调整值,例如: x = x + y;

  • 初始化:用于初始化前变量的第一次赋值的名称,变量具有默认值,对于对象而言,这些对象具有空值。初始化可以与声明一起完成。

  • 范围:一个可变的“寿命”,变量是在范围上,直到代码块,在该点用来存储变量被释放的存储器的末尾。实际上,当代码块结束时,变量被删除或“终止”。

我不知道的是范围如何与声明和赋值交互。虽然变量的范围似乎完全基于声明的代码块,但我不知道赋值如何与范围交互。例如:

public class exampleClass 
{ 
    public static void main(String[] args) // using java for example 
    { 
     int x = 5; // x is declared here, and initialised with a value of 5 
     for (int i = 0; i < 10; i++) // i is declared and initialised here 
     { 
     x = i; // x is assigned the value of i each iteration 
     } // i goes out of scope here 
    System.out.println(x); // the value of x is printed 
    } // x goes out of scope here 
} 

在这个例子中,x声明并初始化(我们只是说初始化?)中的主要方法,并在范围为这个方法。但是,x在while循环中被分配了一个值。此代码执行时会打印什么,但更重要的是为什么?它会打印“5”还是“9”?

我看到代码抛出编译器异常,因为语法会暗示x应该打印5.但是,当我运行此示例代码时,我得到“9”。

最后一个问题,那为什么多个变量可以声明和初始化的直列:

int x = 1, y = 4, z = 6; 

但变量不能分配在线:

x = 1, y = 4, z = 6; 
+0

本质上,这个问题更多的是关于问题的原因以及为什么比结果更重要。我知道范围是基于变量被声明的地方,我不知道为什么或如何,以及处理我不明白的事情困扰着我。另外,虽然我知道这个例子会给我“9”,而不是“5”,如果我不知道的话,它不可能通过谷歌找出来,作为常识的例子,很少在这样的网站上直接宣称,因此,讽刺地使其不那么常见的知识。 –

+2

这些问题中的很多都可能是语言特定的。没有一套适用于所有语言的通用规则。所以我建议添加一个语言标签。 –

回答

0

声明和初始化之间的差别可能是模糊的;有些语言对这些行为做了明确的区分,其他的初始化是声明。如果一个变量在声明的时候被初始化,那么你调用它并不重要。

但是,x在while循环中被分配了一个值。此代码执行时会打印什么,但更重要的是为什么?它会打印“5”还是“9”?

9,因为这是打印之前分配给它的最后一个值。

范围:变量的“寿命”,一个变量在范围内,直到代码块结束,此时用于存储该变量的内存被释放。实际上,当代码块结束时,变量被删除或“终止”。

是和否。范围定义了特定变量的哪些部分可用。不同的语言对其范围规则的定义可能非常不同。一旦变量超出范围,当没有任何代码有任何进一步的访问权限时,变量通常是垃圾收集的(以适用的语言)。在一个简单的功能块中,当功能结束时会发生这种情况。

但是,看到此Javascript例如:

function foo() { 
    var bar = 'baz'; 

    return function() { 
     alert(bar); 
    }; 
} 

其从该函数返回的内部函数仍持有到bar的参考。即使foo结束,bar正在关闭closure并仍在范围内的内部功能。只要存在对该返回函数的引用,bar仍然存在。