簡體   English   中英

識別Java程序中變量的狀態

[英]Identify the state of variables in a Java program

這是一項家庭作業,任務是說明哪些變量在代碼中標有*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)

如果您使用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
分割:24
d:15.0
計數器:0

您似乎將“范圍”和“生命周期”與“可見性”混為一談。

所述ya變量聲明的{}塊的內部,這意味着它們被宣稱塊之外,他們甚至不存在 嚴格地說,說它們不是“可見的”是錯誤的,因為說存在的事物是“可見的”或不可見。 它們的作用域(存在)只是在其中聲明它們的塊,並且它們的生存期“在退出該塊時結束”。

不能認為這意味着編譯器將在所涉及的代碼塊的每個條目上生成用於內存分配的調用,但是該語言的行為就像編譯器有效地執行了此操作一樣。

此外,變量通常僅在聲明變量之后才可引用。 其他語言可能會更寬松,例如,允許在點a處引用y變量(我不知道具體如何與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,但我懷疑它甚至可能被完全禁止。 再一次,無論如何這都是相對較差的做法。

別忘了開始:“這里要問什么?” 因為問題是:在代碼中哪些變量在代碼中可見? 然后,您不能只對您看到的所有變量進行匯總。 但是,僅對執行“ main”方法時可見的變量進行匯總。

不要忘記檢查變量是否在該時間點已經初始化。

寫下之前,請不要忘記檢查變量類型,您認為這將是變量的值。

並注意代碼中的快捷方式。 試想一下,如果這段代碼的編寫不是那么短,而是用多行代碼編寫的,那么輸出將是什么? 然后查看您的第一個想法是否仍然正確。

那應該對你有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM