为啥在某些语言中使用变量之前需要声明变量,而在其他语言中则不需要? [关闭]

Posted

技术标签:

【中文标题】为啥在某些语言中使用变量之前需要声明变量,而在其他语言中则不需要? [关闭]【英文标题】:Why do we need to declare the variable before we use it in some languages, but not in others? [closed]为什么在某些语言中使用变量之前需要声明变量,而在其他语言中则不需要? [关闭] 【发布时间】:2014-05-30 05:13:40 【问题描述】:

在 Python 与 Java 中,如何为变量声明分配内存?如果没有编译步骤,解释语言如何知道变量需要多少内存?

【问题讨论】:

查找强类型与弱类型。 @rpg711 变量声明在弱类型语言中也是强制性的。即使你可能认为它不像 javascript 那样是强制性的,声明一个变量也可以设置它的范围。 它与解释与编译以及键入规则分离。没有任何限制可以阻止某人创建不需要变量声明的强类型编译语言。纯粹是语言创建者的设计决定。 @rpg711 在 JavaScript 中,您使用的变量没有声明它在全局范围内,而不是“您第一次使用它的地方”(这是常见的错误来源)。 @deathlee 这不是一个愚蠢的问题。虽然有点宽泛,你也不是很清楚。讨论有点脱轨:p 似乎这里没有人有明确的答案。 【参考方案1】:

在可用之前,必须为变量分配一个内存位置,然后初始化——无论是Java、Python,还是Logo。

声明意味着通过特定的sn-p代码使该变量变得栩栩如生,其中(以Java为例)类似于

int i;
Person p;

这些已声明,但未初始化。现在,它们在内存中被分配了一个位置——在某些语言中,它可能在位置和大小上都是不断变化的。但无论如何,现在内存中有一些物理位置可供运行时环境查询,以检索变量(指向它的间接指针或实际位置本身)。

既然它有一个空的“盒子”可以进去,它必须被填满,也就是说它必须被“初始化”:

i = 3;
p = new Person();

现在盒子里有一些具体的东西。它可以使用了。在初始化之前尝试使用它会导致(在 Java 中)NullPointerException

某些语言要求您声明变量,以便为它显式分配内存(位置和/或大小)。某些语言会为您执行此内存分配。正如你的问题和这个答案的 cmets 中所述,有很多变化。

【讨论】:

我认为有人误读了这一点,因为您说 Python 必须声明其变量,而实际上您的意思是 Python 必须初始化其变量(否则您将如何使用它们?) 你的两个定义都是错误的。 好的,到目前为止有两次反对票,没有对问题所在提出批评。这是一个非常基本的概念。我想知道什么语言不这样做。 不是反过来吗(例如 C)?声明给你内存,初始化把东西放在那里。我没有反对意见:p,但如果你的第一句话是真的,我是unsure。可能只是人们不喜欢你称之为声明 更好,但这仍然是“声明”的高度非标准定义。此外,许多语言不会将变量分配给内存中的位置。例如,在 Python 中,全局变量的 dict 条目完全有可能在程序执行过程中改变位置。

以上是关于为啥在某些语言中使用变量之前需要声明变量,而在其他语言中则不需要? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如果在声明变量之前使用了变量,为啥不会抛出 ReferenceError?

关于js

为啥/何时应该使用静态声明变量?

为啥 SmsManager 在某些设备上需要 READ_PHONE_STATE 权限,而在其他设备上不需要?

JavaScript中如何使用变量?有啥特殊的语法规则?

为啥“catch”或“finally”范围内的“try”中没有声明变量?