[英]Converting a for-loop with continue statement to while-loop
我正在進行一項練習,其中基於for循環的一小段代碼被轉換為使用while循環執行相同的操作。 目的轉換是錯誤的,如下所示:
int sum = 0;
for (int i = 0; i < 4; i++) {
if (i % 3 == 0) continue;
sum += i;
}
System.out.println(sum); // prints 3
這轉換為:
int i = 0, sum = 0;
while (i < 4) {
if (i % 3 == 0) continue;
sum += i;
i++;
}
System.out.println(sum); // will not print
在練習中,我被要求解釋為什么轉換是錯誤的然后修復它。 我的想法是:
同I = 0的初始值,這將觸發立即繼續進入將循環后,因為(0%3 == 0)將使if語句真。 只要初始值為0,這將執行循環,以便跳過它無數次。 我嘗試更改i = 1的初始值,但是打印了noe sum。 然后我嘗試在執行if語句之前遞增i ,程序現在打印總和7.這里的問題是; 如果i在if語句之后遞增,為什么程序不打印,即使i = 1的初始值表明(在我的腦海中)該程序應該正常運行?
我為每個程序制作了一個表來比較求和。
for-loop版本:
i = 0,sum + = i未執行(繼續),i ++
i = 1,sum = 1,i ++
i = 2,sum = 3,i ++
i = 3,sum + = i未執行(繼續),i ++
i = 4,i <4 false,循環停止
while循環版本:
i = 0,i ++,sum = 1
i = 1,i ++,sum = 3
i = 2,i ++,sum + =我沒有預成型(續)
i = 3,i ++,sum = 7
i = 4,i <4 false,循環停止
在while循環中 ,sum + = i比for循環更多地執行 。 這是將for循環轉換為while循環的正確方法嗎?
int i = 0, sum = 0;
while (i < 3) {
i++;
if (i % 3 == 0) continue;
sum += i;
}
System.out.println(sum);
你的1
專注於它是初始值,但這不是重點。 的一點是, i
當從未遞增i % 3 == 0
為真,而不是0
是初始值。 所以while
循環永遠循環。
你的2
沒有任何意義: while
版本將永遠循環,永遠不會總結任何東西。
這是將for循環轉換為while循環的正確方法嗎?
不,你在錯誤的時間遞增i
。
想想for
循環是如何工作的:
初始化 - 首先,它將變量設置為第一個表達式中的值。
測試 - 然后使用第二個表達式測試值。
執行 - 如果值為true,則執行循環體。
增量 - 當循環體完成時,它執行第三個(增量)表達式。 請注意,這是在循環體之后。
讓你的while
循環執行for
循環正在做的事情。 (我故意不為你做這個;這是一個學習練習。我會注意到轉換for
循環的最佳方法不會continue
使用。“最好,”當然是主觀的。)
在練習中,我被要求解釋為什么轉換是錯誤的然后修復它
轉換是錯誤的,因為當你達到模3等於0的i
值時(在這種情況下是第一次迭代),你將跳到下一次迭代並重新驗證。 但是,由於您在不增加i
情況下直接跳過,因此您將重新驗證相同的條件並重新驗證ad-infinitum 。
你可以通過擺脫continue
和否定條件輕松地解決它:
while (i < 4) {
if (i % 3 != 0)
sum += i;
i++;
}
問題給出的for循環如果轉換為普通英語 ,則表示從0到3的 總和並排除3的 所有倍數 。 (0 + 1 + 2 = 3)
for (int i = 0; i < 4; i++) {
if (i % 3 == 0) continue;
sum += i;
}
所以現在,我們問自己,我們如何將0加到x並使用while循環排除所有3的倍數。 我們將在不查看原始for循環的情況下執行此操作。 ( 有時這樣做更容易,因為我們已經知道for循環的意圖 )
總結從0到3的數字:
int i = 0;
while(i < 4){
sum += i;
i++;
}
要將0到3之間的數字相加,不包括3的倍數:
int i = 0;
while(i < 4){
if(i % 3 != 0)
sum += i;
i++;
}
要將0到3之間的數字相加,不包括3的倍數(使用continue):
int i = 0;
while(i < 4){
if(i % 3 == 0){
i++; //Remember to increase i before continue
continue;
}
else
sum += i;
i++;
}
從continue
,將跳過它下面的所有語句,你必須記住在調用continue
之前做一個增量i++
。 由於你現在已經分為2個條件,因此將會有另一個i++
。
根據while循環邏輯,變量i的增量是有條件的,而for循環則是無條件的。 要使增量邏輯均勻,您應該在兩種情況下遞增。
我認為正確的轉換將是 -
int i = 0, sum = 0;
while (i < 4) {
if (i % 3 == 0) {i++;continue;}
sum += i;
i++;
}
System.out.println(sum);
通常,增量將在while循環的最后一行。 但是,在這個“等待發生的災難”代碼中,有一個條件是跳轉到while塊的末尾而不增加i。 如果依靠i遞增,請確保它始終在任何迭代上執行。 而且,最后,因為你希望它第一次迭代。
while (i < 4) {
if (i % 3 == 0) {
// skip!
} else {
sum += i;
}
i++;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.