2010-02-15 79 views
2

我有一個在Mac上用ANSI C編寫的命令行實用程序,它具有爲單鏈表創建氣泡排序數組的功能。我宣佈了循環變量。C - 循環只執行一次的縮寫

int a = 0; 
int b = 0; 

我寫冒泡排序在縮略式環路(即,在離開變量初始化爲空)。

for (; a < size; a++) 
    for(; b < size; b++) 

這退出前只執行一次。使用i變量填充數組的前一個for循環以相同的方式寫入並按預期執行。對於冒泡排序循環的修復是將a = 0和b = 0放回去。有沒有原因爲什麼縮寫for循環未能執行?

+1

你真的需要循環體外的a和b嗎?如果不是,他們應該在裏面聲明。在循環之外聲明它們意味着它們在循環外部使用,這意味着它們可能不會像循環執行時期望的那樣爲零。 – 2010-02-15 23:41:16

+2

這是ANSI C.如果變量是在內部聲明的(即在C99模式之外使用'for'循環初始聲明),編譯器會拋出警告。 – 2010-02-15 23:52:49

+2

爲了將來的參考,如果您一次只追蹤代碼的執行情況,這種初學者的錯誤會立即變得清晰。您可以在調試器中或手動執行此操作。它確實會幫助你更快更深地學習。 – dmckee 2010-02-16 00:03:31

回答

11

如果省略b=0,則內部循環將只運行一次,因爲在此之後b已經等於大小。您需要在內部循環的每次迭代中將b重置爲0。

+0

這就是答案。我用我的代碼測試了這個。當外循環重新啓動時,內循環未被重置爲零。謝謝! – 2010-02-15 23:56:58

1

一個不同的循環來填充數組被寫入相同的方式並按預期執行。

聽起來像這是在當前循環之前,並使用相同的變量ab

之後沒有將它們重置爲零。

+0

我編輯了文字。前面的for循環使用了i變量。 – 2010-02-15 23:41:56

2

爲什麼你想使用你所謂的for循環的縮寫風格?

for循環是下面的while循環只是syntaxic糖:

for (INIT ; ENDTEST ; STEP){ 
    DO_SOME_STUFF 
} 

意味着

INIT 
while (ENDTEST) { 
DO_SOME_STUFF 
STEP 
} 

因此你的兩個環路做:

int a = 0; 
int b = 0; 
while (a < size){ 
    while (b < size){ 
     DO_SOME_STUFF 
     b++; 
    } 
    a++; 
} 

在這種形式下,你可以很容易看到b的初始化沒有完成。

所有我能說的是避免使用簡寫的for循環,去除初始化沒有比消除結束測試或刪除循環步驟(兩者也是合法的C)都是簡單的方法把蟲子在你的程序更好。 只是不這樣做。

+0

'for'循環並不完全等同於'while'循環。循環體中的'continue'語句在每種情況下都做不同的事情。 – jamesdlin 2010-02-16 02:25:58

+0

你是對的,continue語句在for循環中執行,而不是在上面的while循環中。 – kriss 2010-02-16 07:04:51