[英]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.