2011-04-01 4 views
3

:는 입력가 아닌 경우 만약 내가 이상 갈과 코드가 C에 입력해야 문 경우 문제가 문

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의 점프 명령은 단순히 또 다른 간단한 점프 할 것이다, 오히려 continue으로 귀찮게하지 않고, while로 바로가는 것이 전적으로 가능하다 교수.

+0

네 문제 덕분 이잖아 보인다 – Daniel

0

계속하면 while 문으로 이동합니다. 이것은 아마도 컴파일러에 의한 최적화 때문일 것입니다. continue 다음에 오는 명령문이 없으므로 if 조건이 true인지 여부에 관계없이 결과 단계는 동일합니다.

0

if is redundant. 루프의 마지막 부분이며, 루프를 계속 수행합니다. 어떤 최적화를 사용하면 제거 될 수 있습니다.

코드는 무엇을해야합니까?

0

디버거는 명령문을 실행합니다.

해당 줄에는 전체 문장이 없습니다. 디버거는 명령문의 중간에 멈추지 않습니다.

아래와 같이 여러 줄의 문장이 있다고 가정 해보십시오. 어디에서 디버거가 멈출까요?

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

그럼 당신은이 문을 계속 입력 할 생각입니다 그래서 if 문이 사실이라고 볼 수 있지만, if 문이 사실 인 것처럼 그것은 while 문에 똑바로 가고 있었다 . 나는 계속이가 아니라 오히려 할일로 돌아갈 것이라고 생각했다. 나는 내가 틀렸을 것으로 생각한다. – Daniel

+0

흠 ...'C' 문은 많은 어셈블러 지침으로 나뉘어져있다. 어쩌면'continue'가 마지막의 중간 (끝)으로 점프하고 차례로'do' 블록의 시작으로 점프합니다 ... 디버거가 그것을 이해할 수 없으므로 줄에서 멈 춥니 다. – pmg