为什么可以在没有初始值的情况下声明变量?

时间:2012-12-09 13:59:17

标签: java variables declaration

我正在阅读Gilles Dowek的编程语言原理

他说,也可以在不给它初始值的情况下声明变量,并且我们必须小心不要使用已经声明没有初始值并且没有赋值的变量。这会产生错误。

注意:本书的作者提到在Java上声明没有初始值的变量的可能性。

那么,为什么这个变量声明有效?我什么时候开始使用它?

8 个答案:

答案 0 :(得分:7)

许多不同语言有许多不同的原因。

<强> MEMORY
声明变量时,需要一些内存来保存变量。这涉及向操作系统内核询问内存,或者某种跟踪内存的监视程序。简而言之,这可能是一项昂贵的操作。因此,在许多情况下,希望同时分配对象所需的所有内存,然后分配以后必须分配给它的任何值。这样,您可以提高关键部件中程序的性能。这个用例很常见,允许在没有初始化的情况下允许声明的功能。但是,良好实践断言,在所有其他情况下,您应该在分配时初始化变量。

将内存分配视为官僚机构。纸上工作太多了。因此,如果您知道以后将要使用大量内存,则需要在单个事务中预先提供大量内存,而不是每次都要求内核。

昂贵的初始化
这一点非常类似于上述观点。假设您拥有100万次100万个阵列。初始化这样的阵列是一个昂贵的过程。使用默认值这样做将是愚蠢的,因此,这样的功能,其中分配内存然后根据需要使用。

在这里,就像你正在购买大量的乐高积木来构建一些东西,但你想以默认蜘蛛侠的形状购买它们。店主或你不得不额外努力让他们成为蜘蛛侠的形状,当你无论如何重新塑造他们。

答案 1 :(得分:5)

例如,你可以这样:

int i;
if (first_condition)
    i = 1;
elseif (second_condition)
    i = 2;
else
    i = 0;

您的变量需要在if之外声明,以便稍后使用,但其值在if条件内修复。

答案 2 :(得分:3)

如果你真的看一下当你声明一个变量并初始化它时会发生什么(分配一个初始值),你会看到在机器指令级别下降,或者在Java的字节代码中,使用了大量的计算能力在这两个步骤中。

  1. 声明变量意味着分配内存,创建询问类型的实例等等
  2. 然后初始化该内存位置,再次需要更多处理将默认值移动到分配的内存位置,如果默认值为0则填充0。(注意:当随机内存位置分配给变量时内存可以包含任何模式,由前一个值保留)
  3. 因此,如果用户在没有首先为其类型提供可接受的值的情况下不知不觉地使用变量,那么如果那里的值不正确则可能会出错。

    因此,如果一种语言强迫你在声明时初始化一个变量(或者自己这样做),那么它就会减少错误发生的可能性,但它可能会浪费你不想要的东西的处理能力。 / p>

    另一方面,如果它允许您在不初始化的情况下声明变量,它会为您提供控制并可能为您节省一些计算能力,但可能会出现错误。 (假设您有一个场景,其中varible的初始值取决于其他条件,这些条件将考虑并相应地分配变量。在这种情况下,在声明时初始化var可能只是浪费处理能力。)

    语言决定了他们想要走的路径,主要取决于他们认为的权力。

    如果它是让程序员有机会控制,并制作高度优化的程序,那么他们通常会在没有初始化的情况下允许声明变量,除了更多东西。

    但是,如果该语言是强迫程序员编写更多无错误的程序,那么它将采用另一条路径。

答案 3 :(得分:2)

如果Java要求在读取之前必须始终写入类对象的字段,则需要

  • 类对象的构造函数必须写入该对象的所有字段,包括那些代码在没有第二次写入的情况下永远不会读取的字段;这将是丑陋和低效的。

  • 每个字段必须能够保存never been written值,该值与可以写入其中的任何其他值不同。

  • 编译器必须解决暂停问题,以确定是否可以在未编写的情况下读取字段。

  • 语言必须接受在没有用户代码编写字段的情况下读取字段的可能性。

在这些可能的选择中,#4是最不邪恶的。为了避免未定义的行为,Java定义了读取从未写过的字段的行为:它将包含其类型的默认值。

答案 4 :(得分:1)

您可以在验证脚本中声明一个空var,

$error='';
if(empty($_POST['first_name']{
$error=$error."You did not enter a name";

}

像这样,但是我只会在它重新声明之后立即使用它,如上所述,这样它就不会“错失”。

答案 5 :(得分:1)

好的,这是一个例子。我目前正在设置在PDF论坛上设置为持久的全局值。对于这个应用程序,我想将这些值用作数据存储,就像文本字段一样。不是最好的方法,但它适用于此示例。我没有用数百个隐藏的文本字段填充我的论坛,而是将值设置为持久的全局变量。

如果我的初始减速度设置为 0 &#34;&#34; 作为变量的值,则不会在会话之间保留数据。论坛的初始化会将值重置为空。就像Scrips一样,论坛按顺序运行。在分配值以结转变量之前,它将首先识别文档中的所有脚本。因此,有必要声明没有值的变量,以便初始化不会替换值。

一般来说,在顶部声明所有变量也是很好的保持。可以随意声明它们,但我发现当一个新元素添加到脚本时,我必须上下移动线以保持我的代码干净。如果变量在使用时被声明,那么在声明变量之前变量也变得非常容易,但这不起作用。

此外

在声明时指定值是有效的,但不是通用占位符值。在大多数脚本中,int并不像说 int x = 5; 那么简单。我们通常会调用 this.getField(&#34; TextBox3&#34;)等数据。值; < / strong>或其他一些行代码。通过指定一般值,例如&#34;&#34; 0 true ,即使您未正确使用,您的功能也可能有效利用一个价值。通过不分配值,如果您未能使用变量,那么您的函数将失败,从而使您在解决问题时缩小可能性。如果 int x; 在您使用 x 时仍然 NaN ,那么您的数据收集和验证可能是问题的根源。

通常声明顶部的所有值,并避免设置通用值,除非必须这样做。如果您要稍后定义 x 的值,请将其设置为 int x = 0;

答案 6 :(得分:1)

我是c ++的新手,但我认为这些信息也可能会有所帮助。

从:编程:使用C ++的原理和实践

为什么C ++同时提供声明和定义?声明/定义的区别反映了我们需要使用某种东西(一个接口)和我们需要某种东西来执行其应做的事情(一个实现)之间的根本区别。对于变量,声明提供类型,但只有定义提供对象(内存)。对于函数,声明再次提供类型(参数类型加返回类型),但只有定义提供函数主体(可执行语句)。请注意,函数体作为程序的一部分存储在内存中,因此可以说函数和变量定义会消耗内存,而声明则不会。

答案 7 :(得分:0)

类似的东西:

//declare without giving value.
int i;

//set value
i=9;