Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在for循环中声明变量的优点和缺点?_Java_Variables_For Loop - Fatal编程技术网

Java 在for循环中声明变量的优点和缺点?

Java 在for循环中声明变量的优点和缺点?,java,variables,for-loop,Java,Variables,For Loop,在for循环中声明变量有哪些优点和缺点?? 在这一点上,我想改变我的想法: 讲师强迫我使用: // Declare variables int i; ... for(i = 0; boolen expesion; update) // Note i not declared here 我喜欢做: for(int i = 0; boolean expesion; update) // Note i is declared here 在考试中,以下是我按自己的方式做的扣分。。我试图说服

在for循环中声明变量有哪些优点和缺点?? 在这一点上,我想改变我的想法: 讲师强迫我使用:

// Declare variables
int i;
...

for(i = 0; boolen expesion; update)   // Note i not declared here
我喜欢做:

for(int i = 0; boolean expesion; update)   // Note i is declared here
在考试中,以下是我按自己的方式做的扣分。。我试图说服他,告诉他:

  • 我没有看到代码按他的方式运行
  • 这不是那么重要的变量,所以让它成为局部变量是有意义的
  • 在for循环中可能需要使用long变量类型
他的回答是:“如果这里有几个循环,您不需要重复声明同一个变量。”。。如果你是来自外国的一年级学生,很难与讲师争辩你的特殊性。但是int并没有占用太多内存,而且java有一个垃圾收集器来清理内存


所以,请帮我说服他,或者我,用一个好的论据。

这句话说得对:“不要和他争论。按照他要求的去做,考试后做你想做的。”

然而,你的教授确实有一个观点,关于什么时候这是有效的,并且应该这样做,我假设你遗漏了。例如,通过将索引变量保留在For循环范围之外,您可以稍后引用它。(当数组从未知源传入时(例如提取数据库),这对于确定数组的大小非常有用)。同样,每次运行循环时不必设置新变量(通过将i设置回零,但这取决于语言,但在汇编设置中,我可以在CPU上看到一些寻址和push/pop/ext…值),这也有一定的价值(值得商榷)

然而,在大多数情况下。。。除了一些非常低水平的处理增益(这是有争议的),没有其他真正的好处。我假设你的教授要么是一个从事商业多年、受过良好教育的低端程序员,要么是一个具有高开销应用程序经验的程序员

他的回答是:“如果这里有几个循环,你不需要这样做 重复声明同一个变量“.”。。这很难反驳 讲师:那么你是来自外国的一年级学生 国家。但是int并没有占用太多内存,加上java有垃圾 收集器来清理内存

这是一个关于在学术界学习编写软件的丑陋事实。除非你们的系主任不仅比大多数讲师都好,而且在为学生辩护时也很自信,否则你们很可能会降低你们的分数。我在大学时,有一位教授因使用“先进技术”而给学生打分而享有盛名。我指的是他讲课前的章节。即使他们能够完全准确地表达他们在做什么,证明他们不仅仅是复制和粘贴

事实上,你的教授对于大多数常见的循环是错误的。除非您的代码需要在循环之后引用索引变量,否则最好在范围更改时删除该变量。对于大多数实际的循环,他的方法不仅是必要的。这甚至是不可能的,因为今天很多“for”循环实际上是针对这样的每个循环

for (String s : someArray) {
    System.out.println(s);
}
或(Groovy)

更新:另一件我认为是大错特错的事情教授的论点是,除非绝对必要,否则将国家暴露在外通常是不好的。一般来说,这对于任何语言来说都是一个糟糕的想法,但对于垃圾收集语言来说尤其如此。由于变量是一个
int
而不是
Integer
(对于初学者来说,堆栈上的原语和堆上的对象),所以在这种情况下就不那么重要了。然而,在处理对象时,编写代码时应该注意让GC说“这个作用域已经退出,让我们清理一下它里面的所有东西”这样的话,这样做很简单

随着时间的推移,如果你有保持不必要状态的习惯,你就有可能导致内存泄漏。您的习惯可能会使GC更难完成其工作和长时间运行的任务,这可能会导致内存需求增加和不稳定性。你不需要以任何方式成为函数式语言的纯粹主义者,但你需要借用它的精神,它将状态视为一种必然的邪恶,而不是来自天堂的祝福。

他是对的,你不需要重复声明相同的变量,但是:

  • 将变量的范围限制在使用它们的地方是一种很好的做法

  • 单独声明变量实际上还需要一行源代码,因此它本身并没有减少代码

  • 在每个
    for
    循环中声明变量不会占用更多空间

  • 生成的字节码是相同的

因此,如果您不需要
for
循环之外的变量,则应始终在
for
循环的范围内声明变量。有助于防止意外地将变量重新用于其他目的

让我们看一下下面的代码:

static void test1() {
    int i;
    for (i = 0; i < 10; i++)
        ;
    for (i = 0; i < 10; i++)
        ;
}
static void test2() {
    for (int i = 0; i < 10; i++)
        ;
    for (int i = 0; i < 10; i++)
        ;
}

如您所见,它们完全相同,因此它们在堆栈上为局部变量使用相同的空间。

不要与他争论。按照他让你做的去做,考试后做你想做的。如果有多个循环,这是有益的,尽管考虑到现代机器,好处很小。GC也不是一个问题——JVM通常足够聪明,可以在以后不使用变量时对其进行GC。这个问题/论点就像大象身上的抓痕。也许他以前用旧的C语言编程?(例如:C99之前)那时你必须这样做。虽然不值得争论,但我也更喜欢第二种风格(因为编译器通常能够优化代码),我同意并希望添加第二种方式可能会添加少量1。讲师总是对的。2.如果讲师不正确,请参见1。考试结束后,忘了在80'中编程leart,其中有几个字节
static void test1() {
    int i;
    for (i = 0; i < 10; i++)
        ;
    for (i = 0; i < 10; i++)
        ;
}
static void test2() {
    for (int i = 0; i < 10; i++)
        ;
    for (int i = 0; i < 10; i++)
        ;
}
static void test1();               static void test2();
  Code:                              Code:
     0: iconst_0                        0: iconst_0
     1: istore_0                        1: istore_0
     2: goto          8                 2: goto          8
     5: iinc          0, 1              5: iinc          0, 1
     8: iload_0                         8: iload_0
     9: bipush        10                9: bipush        10
    11: if_icmplt     5                11: if_icmplt     5
    14: iconst_0                       14: iconst_0
    15: istore_0                       15: istore_0
    16: goto          22               16: goto          22
    19: iinc          0, 1             19: iinc          0, 1
    22: iload_0                        22: iload_0
    23: bipush        10               23: bipush        10
    25: if_icmplt     19               25: if_icmplt     19
    28: return                         28: return