2010-02-06 35 views
2

當運行下在iPhone模擬器調試這個代碼,它正確地隨r == 4後循環的5次迭代退出: -Xcode的「無限循環」不一致

int r; 
for (r = 0;;r++) 
{ 
    if (r == 4) 
     break; 
} 

沒有大括號,它與離開ř== 1之後1次迭代: -

int r; 
for (r = 0;;r++) 
    if (r == 4) 
     break; 

沒有大括號,但與測試表達式,其爲真,代替永久真默認爲一個丟失測試表達式的,它正確地隨r == 4退出經過5次迭代後: -

int r; 
for (r = 0; r > -100;r++) 
    if (r == 4) 
     break; 

我在這裏丟失了什麼,或者是第二個例子是一個編譯器錯誤?

回答

2

我沒有模擬器,但如果真的發生了什麼事情,那麼是的,出現了問題。就語言而言,你的第一個和第二個例子是相同的。你確定你的測試是準確的嗎?你上面給我們展示的代碼正是你在模擬器中運行的代碼?

編輯:好的我試過了,它在模擬器中正常工作。我最好的解決你的問題的猜測是,你有:

for (r = 0;r++;) 

意外的情況下,你認爲是失敗的。請注意,空循環語句是從您上面寫的內容中移出的。這個for循環會給你1的結果。

編輯2:在閱讀了一些其他的答案後,我想我應該檢查出調試器。看看這個截圖! image http://img38.imageshack.us/img38/7128/xcodeh.png

如果我再次按下「step over」,它會重新回到循環中;只是一個小小的圖形呃逆。

+0

「for」中的三個分號會產生編譯時語法錯誤。 – 2010-02-06 01:18:22

+0

糟糕!編輯時間。謝謝,做了我自己的錯字。 – 2010-02-06 01:20:37

+1

+1提供了我試圖描述的屏幕截圖:) – 2010-02-06 01:40:29

0

對我來說看起來像一個編譯器錯誤。你有什麼編譯器,gcc或llvm-gcc?

我剛剛用gcc 4.2.1(Apple Inc. build 5646)進行了測試,並在兩種情況下都得到了正確的結果。

2

我不知道你的問題應該被認爲是重複的,但也許這就是答案:

Are loops with and without parenthesis handled differently in C?

調試器在同一時間執行一個聲明

我在以前的回答中有點誤。當然,調試器也執行循環4次。不同的是,它看起來像像他一次迭代後退出。當調試以下代碼:

#include <stdio.h> 

int main (int argc, const char * argv[]) { 
    int r; 
    for (r = 0;;r++) 
     if (r == 4) 
      break; 

    printf("%i",r); 
    return 0; 
} 

調試器再次處理for線,那麼if線,該for行,然後凸顯printf線。所以看起來好像要執行printf,但在下一步中,調試器再次突出顯示if行,然後轉至for,從而增加r,然後再次突出顯示printf

這是我在Xcode嘗試了代碼,它基本上是上述(I只是在新鮮可可應用項目添加一些代碼行中main.m)所描述的相同的行爲:

#import <Cocoa/Cocoa.h> 

int main(int argc, char *argv[]) 
{ 
    int r; 
    for (r = 0;;r++) 
     if (r == 4) 
      break; 
    return NSApplicationMain(argc, (const char **) argv); 
} 

圖片與可可應用:

Debugger http://img691.imageshack.us/img691/3844/1002060002.png

所以現在的問題是,你有沒有真正通過循環步步點擊,是一個迭代後的循環真正退出,或之後你剛剛停止一次迭代?

+0

我不認爲這是同一個問題;你鏈接到的問題是關於調試器步進;整個循環的執行沒有語義上的差異。 – 2010-02-06 01:10:36

+0

@Carl Norum:我現在不知道你的意思是什麼*語義差異*,但OP也提到*調試*他的代碼。所以我很肯定至少答案可以在這裏適用。 – 2010-02-06 01:15:48

+0

我要去嘗試一下;但任何改變程序控制流的調試器都是壞消息。 – 2010-02-06 01:20:21

0

這不是一個錯誤。這基本上就是C語法。沒有括號for/while循環或if條件被認爲只有一行後聲明,你在下一行找到不屬於循環/條件了。否則,將括號實際上定義爲行,就像你在迭代中所做的那樣。 希望這有助於。