2016-07-27 187 views
-2

我碰到這個代碼For循環無條件

var i=Array.ConvertAll(Console.ReadLine().Split(),int.Parse); 
for(int x=i[0]-i[2],y=i[1]-i[3];;Console.WriteLine((0!=y?0<y--?"S":"N":"")+(0!=x?0<x--?"E":"W":""))); 

我想我明白int x=i[0]-i[2],y=i[1]-i[3]但讓我困惑的是,有沒有結束條件的一部分。所以我的問題是,這個循環如何終止?

我看到了這個答案,它討論了一個無限循環。

For Loop without condition

+2

但是,我都是爲了減少變量混亂,這是非常鈍的代碼。 –

+0

循環聲明的所有3個部分(初始值,條件,迭代器)都是可選的。這意味着'for(;;)'與'while(true)'同義。 – spender

+0

這是一個無限循環。正如下面的答案所述,所有三個部分都是可選的。 @lrb看起來像是從一些扭曲的C++書籍中複製的「讀取此代碼」任務(類似的構造可以在C++中是優雅的,雖然是imho) –

回答

4

在編程語言中,存在被寫入到永久運行迴路,除非收到一些外部條件(例如,一個異常,或用戶信號)。有時候,這樣的「無限」循環是錯誤地寫的。

問題中的循環似乎只是一個無限循環的情況,可能是故意寫的。

+0

嗯,我不得不再次看,因爲循環不是無限的。 Mabe別的東西觸發了它的終止。 – Mike

+0

您發佈的代碼片段不會顯示任何退出條件,但當然它會在那裏,如果您看到它發生。 :-) – PNS

0

從問題中的循環

for(int x=i[0]-i[2],y=i[1]-i[3];;Console.WriteLine((0!=y?0<y--?"S":"N":"")+(0!=x?0<x--?"E":"W":""))); 

絕不會走到盡頭。你可以在它後面加入類似Console.WriteLine("Loop finished, yet.")的內容。這條線永遠不會到達。

,你看到的是,循環無論玩完了,可能有以下原因:

  • 根據用戶對的ReadLine語句輸入,初始化數組或int x=i[0]-i[2],y=i[1]-i[3]訪問它會導致例外。然後循環將不會被執行。
  • 也許執行循環的線程被中止。
  • 如果在不中止線程或執行循環的情況下執行循環,則循環變量x和y最終都將爲零。然後循環將只產生空行。也許有人誤解了這個結局。但循環仍然繼續。 (變量x和y最終都是零,因爲在每一步中,如果它們不是零,它們會減1;如果它們以負值開始,它們將達到儘可能小的整數值,之後它們將達到最高可能值那麼它們會正常減少,直到它們達到零,然後它們將始終保持爲零)。

儘管如此,循環是無限的。如果它被中止,其原因絕對不在該循環中,只在外部。

在我看來,for循環的迭代部分僅用於更改循環變量。一個人發明了其他東西,如屏幕輸出或其他東西的循環的身體部分。因此,上面的循環是錯誤的代碼。