2010-02-15 5 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가 정말로 필요합니까? 그렇지 않으면 그 안의 것으로 선언되어야합니다. 루프 외부에서 선언하면 루프 외부에서 사용되므로 루프가 실행되는 시점까지 예상 한대로 0이 아닐 수도 있습니다. –

+2

이것은 ANSI C입니다. 변수가 내부 선언 된 경우 (즉, 'for'루프 초기 선언이 C99 모드 외부에서 사용됨) 경고가 발생합니다. –

+2

나중에 참조 할 때,이 종류의 초보자 실수는 코드 실행을 한 번에 한 단계 씩 추적하면 즉시 명확 해집니다. 디버거에서 또는 수동으로이 작업을 수행 할 수 있습니다. 정말 더 빠르고 더 배우는 데 도움이 될 것입니다. – dmckee

답변

11

b=0을 생략하면 내부 루프가 정확하게 한 번 실행됩니다. 그 이후에 b는 이미 크기와 동일하기 때문입니다. 내부 루프의 반복마다 b를 0으로 재설정해야합니다.

+0

그게 답입니다. 나는 이것을 내 코드로 테스트했다. 외부 루프가 다시 시작될 때 내부 루프가 0으로 재설정되지 않았습니다. 감사! –

1

다른 for 루프가 배열을 채울 때와 같은 방식으로 작성되고 예상대로 실행되었습니다. 이 전류 루프 전과와 같은 변수를 ab과 같이 사용

이 들린다.

그리고 다시 0으로 재설정하지 않았습니다.

+0

본문을 편집했습니다. 이전 for 루프는 i 변수를 사용했습니다. –

2

왜 for 루프의 약식 스타일을 사용하고 싶습니까?

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++; 
} 

당신이 할 수있는이 양식에서 루프에 대한

아래 while 루프를위한 단지 syntaxic 설탕입니다 b의 초기화는 어디에서해야하는지 쉽게 알 수 있습니다.

내가 할 수있는 말은 생략 된 for 루프를 사용하지 않는 것입니다. 초기화를 제거하는 것이 최종 테스트를 제거하는 것 또는 루프 단계를 제거하는 것 (모두 C에서 합법입니다)은 모두 프로그램에 버그를 넣는 쉬운 방법입니다. 그냥하지 마세요.

+0

'for' 루프는'while' 루프와 완전히 같지 않습니다. 루프 본문의'continue' 문은 각각 다른 경우를합니다. – jamesdlin

+0

맞습니다. continue 문은 for 루프가 아닌 위의 단계를 실행합니다. – kriss

관련 문제