簡體   English   中英

循環內變量的初始化

[英]Initialisation of a variable inside a loop

class Spaces {
public static void main(String args[])
throws java.io.IOException{

    char ch;
    int space = 0;

    do {

        ch = (char) System.in.read();
        if (ch == ' ') space++;

    } while (ch != '.'); //Stop if fullstop is provided

System.out.println("No. of spaces: " + space);
}

上面的以下代碼是完全正確的,並且完全按照預期的方式進行操作(要讀取字符直到按下句號,然后告訴用戶已經輸入了多少空格)。 盡管如果我在do-while循環外初始化變量,如以下代碼所示:

class Spaces {
public static void main(String args[])
throws java.io.IOException{

    char ch = (char) System.in.read();
    int space = 0;

    do {

        if (ch == ' ') space++;

    } while (ch != '.'); //Stop if fullstop is provided

System.out.println("No. of spaces: " + space);
}

該程序拒絕停止。 當我進入句號時,程序沒有停止。 我確實知道在循環內聲明變量將意味着該循環外的其他地方不可用。 但是在循環外部聲明的變量(例如在第二組代碼中)應該在循環和其他地方起作用。 所以我不明白為什么第二組代碼無效(程序運行,沒有編譯錯誤,但是當輸入句號時,它繼續運行)。

與這里提出的問題相比,我也知道這是一個非常基本的問題。 但老實說,我找不到答案。 先感謝您。

第二個程序不起作用,因為您只接受一次輸入,並且ch != '.' 永遠是對的,循環永遠不會停止。 您應該將System.in.read()放入循環內,以便在每次迭代中,程序都將停止用戶輸入,將其與條件進行比較,然后決定是否應該執行下一次迭代。

你不能ch =(char)System.in.read(); 跳出循環。 因為您總是必須要求系統為您提供新角色。

嘗試打印您的字符,您會發現您始終在打印第一個字符,並且處於無限循環中。

此循環開始時ch任何值都將永遠保留在那里,因為沒有任何內容可寫入:

    do {

        if (ch == ' ') space++;

    } while (ch != '.'); //Stop if fullstop is provided

您必須從循環內部調用System.in.read()。 像這樣:

class Spaces {
public static void main(String args[])
throws java.io.IOException{

    char ch = 0;
    int space = 0;

    do {
        ch = (char) System.in.read();
        if (ch == ' ') space++;

    } while (ch != '.'); //Stop if fullstop is provided

    System.out.println("No. of spaces: " + space);
}

只讀取一個字符的方式。

而且afaik我知道您不必為main方法編寫throws語句。

您正在do...while循環之外調用System.in.read() ,因此它的值永遠不會更新。 輸入句號將不會在第二個代碼中有所不同,因為ch的值永遠不會更新。 它始終等於您將其初始化為的值(在第二個示例中為System.in.read()

考慮到您的困惑,在循環外部聲明的變量可以在循環中工作,但是如果您要保留更改,則需要對其進行更新。 例如:

int count=0;
for(int i=0; i<10; i++) {
    count++;
}
//count will be 10 now

正如您在問題中所看到的,這就是為什么第一套代碼起作用的原因,因為

    char ch; 
    int space = 0;

    do {

        ch = (char) System.in.read(); //ch is updated
        if (ch == ' ') space++;

    } while (ch != '.'); 

ch已更新。 你也可以

char ch = (char)System.in.read();
int space = 0;

do {

    ch = (char) System.in.read();
    if (ch == ' ') space++;

} while (ch != '.'); 

您實際上是在循環外實例化變量,但必須再次在循環內更新該值。

變量聲明變量初始化不同, 變量初始化設置分配變量也不相同。

在程序的兩個版本中,變量聲明都在do-while循環之外。 變量聲明包括可變類型和變量名,這樣既char ch; char ch = (char) System.in.read(); 將變量ch聲明為char類型。

變量初始化是在聲明變量時為其賦值。 例如,嘗試運行該程序。

int i; // declaration and initialisation to default value
System.out.println("The integer is: " + i);

Java具有任何變量初始值的默認值。 如果您不想使用此默認值,則可以使用自己的值。 在此示例中,我們將變量i聲明為int類型,並將其初始化為值5

int i = 5; // declaration and initialisation
System.out.println("The integer is: " + i);

最后,在聲明並初始化變量后,可以為該變量分配一個新值。 請注意,在分配變量時,不會聲明變量的類型-僅在聲明中完成。

int i = 5; // declaration and initialisation
i = 6;     // assignment
System.out.println("The integer is: " + i);

分配變量將存儲一個值,並使用變量讀取存儲的值。 像這樣將變量移到循環外通常是可以的。 但是, System.in.read()不是常用的表達式,因為它是不純的 這意味着當您使用相同的參數調用System.in.read ,它並不總是產生相同的值。 為了證明這一點,請嘗試運行示例程序的兩個版本。

版本A

int a = (int) System.in.read();
int b = (int) System.in.read();
System.out.println("a is: " + a);
System.out.println("b is: " + b);

版本B

int a = (int) System.in.read();
int b = a;
System.out.println("a is: " + a);
System.out.println("b is: " + b);

如果編寫程序A,則可能傾向於使用相等的可傳遞性來簡化程序。 也就是說,如果b = (int) System.in.read()a = (int) System.in.read()則通過傳遞性, b = a 但是,僅當System.in.read()每次使用時都產生相同的值時,這種情況才成立,並且由於不純,事實並非如此。

還要注意,在程序B中,沒有兩次提示您輸入輸入。 這是因為System.in.read僅被調用一次以初始化變量a 使用a(即讀取)使用b分配b或使用System.out.println將其打印到控制台時,不會調用a方法。 為了清楚起見,也請嘗試運行該程序。

int a = (int) System.in.read();
System.out.println("a is: " + a);
a = (int) System.in.read();
System.out.println("a is: " + a);

終於來到您的循環,它可能不會終止的原因是因為ch的值是不變的 這意味着ch的值在循環執行期間不會改變。

// ch is declared and initialised
char ch = (char) System.in.read();
int space = 0;

// There are no assignments to ch in the loop, so it remains invariant 
// during the loop's execution. This means if `ch != '.'` tests true
// once it will continue testing true.
do {
    if (ch == ' ') space++;
} while (ch != '.');

// ch is declared and initialised
char ch;
int space = 0;

// ch is assigned during the loop to an impure expression and has the 
// potential to vary for each iteration of the loop. This means even
// if `ch != '.'` tests true once it may not test true next iteration.
do {
    ch = (char) System.in.read();
    if (ch == ' ') space++;
} while (ch != '.');

暫無
暫無

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

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