识别Java程序中变量的状态

时间:2019-04-26 07:55:06

标签: java

这是家庭作业,任务是说明在标记为*a*,...,*e*的代码点上哪些变量可见,以及每个变量具有什么值。有人可以告诉我我的解决方案是否正确吗?

public class Zustand {
  public static void main(String[] args) {
    final int DIV = 24;
    int variable;
    int counter = 1;
    {
      // *a*
      variable = counter++;
      int y = 12;
      variable += y;
      counter++;
      // *b*
    }
    final double d;
    {
      counter = 4;
      double a = 10.0;
      {
        d = a + ++counter;
        // c
      }
      counter = 3;
      while (counter > 0) {
        counter--;
        a -= counter;
        // *d*
      }
    }
    variable = variable / DIV;
    // *e*
  }
}

首先有哪些变量?我的答案是:

  • final int DIV
  • int variable
  • int counter
  • int y
  • final double d
  • double a

每个*a*,...,*e*都有6个变量。我将为6元组(DIV, variable, counter, y, d, a)分配另一个6元组,其中元组的组成部分可以是数字,字符w或符号--表示它不可见。如果是数字,则表示它是可见的,并且该数字是分配给变量的值。如果它是字符w,则表示该变量未分配任何值,但可见。

所以,这是我的解决方案(对吗?)。如果出现问题,请提示我可能会发生的错误。

  • *a* =(24,w,1,-,-,-)
  • *b* =(24,14,2,12,-,-)
  • *c* =(24,14,4,12,15,10.0)
  • *d* =(24,14,0,12,15,4.0)
  • *e* =(24,0,0,12,15,4.0)

3 个答案:

答案 0 :(得分:1)

如果您使用System.out.println,它将帮助您解决问题!

public static void main(String[] args) {
    final int DIV = 24;
    int variable;
    int counter = 1;
    {
      // *a*
      variable = counter++;
      int y = 12;
      variable += y;
      counter++;
      // *b*
      System.out.println("y: " + y);            //  just an example

    }
    final double d;
    {
      counter = 4;
      double a = 10.0;
      {
        d = a + ++counter;
        // c
        System.out.println("d: " + d);             //  just an example

      }
      counter = 3;
      while (counter > 0) {
        counter--;
        a -= counter;
        // *d*
        System.out.println("a: " + a);                   //  just an example
      }
    }
    variable = variable / DIV;
    // *e*

    System.out.println("variable: " + variable);            //  just an example
    System.out.println("DIV: " + DIV);
    System.out.println("d: " + d);
    System.out.println("counter : " + counter);
}

在控制台中,您将看到类似这样的内容。

  

y:12
  d:15.0
  a:8.0
  a:7.0
  a:7.0
  变量:0
  DIV:24
  d:15.0
  计数器:0

答案 1 :(得分:1)

您似乎将“范围”和“生命周期”与“可见性”混为一谈。

ya变量在{}块内声明,这意味着在声明它们的那个块之外,它们 甚至不存在< / em> 。严格地说,说它们不是“可见的”是错误的,因为说 存在 的东西是“可见的”。它们的作用域(存在)只是在其中声明它们的块,并且它们的生存期“在退出该块时结束”。

这绝不能意味着编译器将在所涉及的代码块的每个条目上生成内存分配的调用,但是该语言的行为就像编译器有效地执行了此操作一样。

此外,变量通常仅在声明变量之后才可引用。其他语言可能会更宽松,例如,允许y变量已经在 a 点处被引用(我不知道具体是什么与Java一起使用,现在没有编译器,但我怀疑这不是-无论如何,在声明之前引用总是被认为是不好的做法。

最后,变量在整个作用域和生命周期中都是“可见的”,除非它们被新的声明隐藏。某些语言允许您执行此操作:

{
 int y = 0;  /* 1st variable */
 {
  long y = 5;  /* 2nd variable, DISTINCT from the first (note the different type), and "hiding" the first */
               /* (so at this point, TWO variables EXIST but only ONE is VISIBLE) */
               /* references to y here will be to the SECOND variable */
 }
}

再一次,我不知道该如何使用Java,但我怀疑它甚至可能被完全禁止使用。再一次,无论如何这都是相对较差的做法。

答案 2 :(得分:1)

别忘了开始:“这里要问什么?” 因为问题是:在代码中哪些变量在代码中可见? 然后,您不能只对您看到的所有变量进行汇总。但是,仅对执行“ main”方法时可见的变量进行汇总。

别忘了检查变量是否在该时间点已经初始化。

在写下之前,请不要忘记检查变量类型,您认为这将是变量的值。

并注意代码中的快捷方式。 试想一下,如果这段代码的编写不是那么短,而是用多行代码编写的,那么输出将是什么?然后看看您的第一个想法是否仍然正确。

应该会帮助您。