首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编程基础:变量声明、属性、赋值和作用域

编程基础:变量声明、属性、赋值和作用域
EN

Stack Overflow用户
提问于 2016-03-03 06:23:07
回答 1查看 45关注 0票数 0

作用域如何与变量声明、初始化和赋值交互?根据我迄今所了解到的情况,这些术语的定义如下:

  • 声明:声明变量的类型及其名称/标识符。在分配或读取变量之前,必须声明了这些变量。
  • 赋值:丢弃一个变量的现有值,用一个新的变量替换它,旧的值在赋值语句的末尾被丢弃,因此该值可以增加或调整,例如:X=x+ y;
  • 初始化:用于变量第一次赋值的名称,在初始化之前,变量具有默认值,对于对象,这些对象具有空值。初始化可以与声明一起进行。
  • 作用域:变量的“生存期”,一个变量在作用域中直到代码块结束,此时用来存储该变量的内存将被释放。实际上,当代码块结束时,变量将被删除或“终止”。

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

代码语言:javascript
复制
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是声明和初始化的(我们只是说初始化吗?)在主要的方法中,并且是在范围内的那个方法。但是,在while循环中为x分配了一个值。执行此代码时将打印什么,但更重要的是为什么?它是打印"5“还是"9"?

我见过代码抛出编译器异常,因为语法意味着x应该打印5。然而,当我运行这个示例代码时,我得到了"9“。

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

代码语言:javascript
复制
int x = 1, y = 4, z = 6;

但是变量不能内联地分配:

代码语言:javascript
复制
x = 1, y = 4, z = 6;
EN

回答 1

Stack Overflow用户

发布于 2016-03-04 14:27:50

声明和初始化之间的区别可能是模糊的;有些语言清楚地区分了这些操作,而在另一些语言中,初始化就是声明。如果在声明变量时初始化了它,那么您将其命名为什么并不重要。

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

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

作用域:变量的“生存期”,一个变量在作用域中直到代码块结束,此时用来存储该变量的内存将被释放。实际上,当代码块结束时,变量将被删除或“终止”。

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

但是,请参见这个Javascript示例:

代码语言:javascript
复制
function foo() {
    var bar = 'baz';

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

从该函数返回的内部函数仍然保持对bar的引用。即使foo结束,bar也被闭锁关闭,并且仍然在内部函数的作用域内。只要对返回函数的引用存在,bar仍然存在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35764650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档