编程基础:变量声明,初始化,赋值和范围

时间:2016-03-03 06:23:07

标签: variables scope programming-languages

范围如何与变量声明,初始化和赋值相互作用?根据我迄今所学的内容对这些术语的定义如下:

  • 声明:说明变量的类型,以及它的名称/标识符。变量必须在分配或读取之前声明。

  • 赋值:抛弃变量的现有值并用新值替换它,旧值在赋值语句的末尾被抛弃,因此值可以递增或以其他方式调整,例如: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在main方法中声明并初始化(我们只是说初始化了吗?),并且在该方法的范围内。但是,在while循环中为x分配了一个值。执行此代码时将打印什么,但更重要的是为什么?它会打印“5”还是“9”?

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

最后一个问题,为什么可以内联声明和初始化多个变量:

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

但不能内联分配变量:

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

1 个答案:

答案 0 :(得分:0)

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

  

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

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

  

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

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

但是,请参阅此Javascript示例:

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

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

从此函数返回的内部函数仍保留对bar的引用。即使foo结束,bar正由<{3}} 关闭,但仍在内部函数范围内。只要存在对返回函数的引用,bar仍然存在。