2011-04-01 83 views
3

我有去在if語句,代碼應在c輸入一個問題:不進入if語句

void getInput(void) 
    { 
     static size_t _read = 0; 
     memset(line, 0, _read); 
     do{ 
      memset(line, 0, _read); 
      write(STDOUT_FILENO, ">> ", 3); 
      _read = read(STDIN_FILENO, line, MAXLINE - 1); 
      if (line[0] == '\n' || line[0] == '\r') 
       continue; 
     }while(line[_read - 1] != '\n'); 
     line[_read] = '\0'; 
    } 

的問題是在該行「如果(行[0] ==「\ n'|| line [0] =='\ r')「這裏是調試器的摘錄。

getInput() at main.c:29 
29   if (line[0] == '\n' || line[0] == '\r') 
1: line[0] = 10 '\n' 
(gdb) step 
31  }while(line[_read - 1] != '\n'); 
1: line[0] = 10 '\n' 
(gdb) list 29 
24  memset(line, 0, _read); 
25  do{ 
26   memset(line, 0, _read); 
27   write(STDOUT_FILENO, ">> ", 3); 
28   _read = read(STDIN_FILENO, line, MAXLINE - 1); 
29   if (line[0] == '\n' || line[0] == '\r') 
30    continue; 
31  }while(line[_read - 1] != '\n'); 
32  line[_read] = '\0'; 
33 } 

正如您所看到的,它不會進入continue語句,而是直接進入while語句。我確實認爲繼續會發生在while語句中,但我仍然不明白爲什麼它沒有先行繼續。

感謝

回答

1

如果您啓用優化編譯,這是完全有可能的if跳轉指令僅僅是直行到while,而不是與continue困擾,這也只是另一種簡單的跳躍指令。

+0

呀看來問題由於多數民衆贊成 – Daniel 2011-04-01 13:02:16

0

繼續將帶你到while語句也。這可能是由於編譯器的優化。它檢測到在繼續之後沒有語句,因此無論if條件是否爲真,結果步驟都是相同的。

0

你的if是多餘的。這是循環中的最後一件事,它所做的只是繼續循環。如果您使用任何優化,它可能會被刪除。

你的代碼應該做什麼?

0

調試器執行語句。

該行並沒有完整的聲明;調試器從不停止在聲明的中間。

想象一下你有如下的多行語句。調試器停止在哪裏?

for (
    i = 0; 
    i < 100; 
    i++) 
      sum += a[i]; 
+0

那麼你可以看到,因此它是假設在進入continue語句if語句是真的,但它會直接進入while語句猶如if語句是不真實。我在想,繼續會回到做的而不是那個時候。我暗示我猜錯了 – Daniel 2011-04-01 13:13:10

+0

嗯...... C語句被拆分成許多彙編指令。也許'continue'跳轉到最後的中間(結束),然後跳轉到'do'塊的開頭......並且調試器無法理解,所以它停在線上。 – pmg 2011-04-01 13:32:09