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

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

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

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

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

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

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

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

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

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

例如,你可以这样:

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

您的变量需要在if之外声明,以便稍后使用,但其值在if条件中是固定的。

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

  1. 声明变量意味着分配内存,创建一个ask类型的实例等
  2. 然后初始化该内存位置,再次需要更多处理将默认值移动到分配的内存位置,如果默认值为0则填充0。(注意:当随机内存位置分配给内存可能包含的变量时任何模式,由前一个值留下)

因此,如果用户在不知情的情况下使用变量而没有首先为其类型提供可接受的值,那么如果那里的值不正确则可能会出错。

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

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

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

如果它是让程序员有机会控制,并制作高度优化的程序,那么除了更多的东西之外,他们通常会允许声明变量而不进行初始化。

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

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

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

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

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

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

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

您可以在validation脚本中声明一个空的var,

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

}

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

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

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

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

另外

在声明时指定值是有效的,但不是通用的占位符值。 在大多数脚本中,int并不像说int x = 5那么简单; 更常见的是我们调用this.getField(“TextBox3”)等数据 或其他一些行代码。 通过分配诸如“”0或者值的通用值,即使您未能正确使用某个值,您的function也可能有效。 通过不分配值,如果未能使用变量,则function将失败,从而缩小解决问题的可能性。 如果是int x; 当您使用x时,仍然是NaN而不是数据收集,并且validation可能是问题的根源。

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

就像是:

 //declare without giving value. int i; //set value i=9;