반복문 for 의 함정

2013. 10. 23. 02:37 from Language/C언어

for 와 while 은 반복문으로써 자주 사용된다. while 문을 그대로 for 로 대체할 수도 있지만 상황에 따라서 while 도 쓰고 for 도 쓰인다. for 에 대한 설명은 인터넷에 찾아보면 자주 나오므로 생략. 



반복문의 함정을 이야기 하기 전에 변수의 범위에 대하 잠깐 이야기 해보자. 변수의 범위(scope)는 크게 두가지로 나뉜다. 첫째로 변수에 접근할 수 있는 영역. 둘째로 메모리상에 존재하는 기간. 변수에 접근할 수 있는 영역은 지역변수 전역변수에 관한 내용으로 쉽게 이해할 수 있다. 그리고 많이들 알고 있으므로 생략.


변수가 메모리상에 존재하는 기간은 조금 낯설수도 있다. 쉽게말해서 변수가 메모리에 저장 되었다가 메모리에서 삭제되는 기간을 이야기 하는것이다. 지역변수가 메모리에 저장되는 타이밍은 변수 선언을 할때이다. 어떤 함수내에서 변수를 선언하면 동시에 메모리에 저장되는 것이다. 그리고 메모리에서 삭제되는 타이밍은 그 함수를 종료할 때이다.

- 지역 변수는 함수가 호출될 때 메모리상에 올라갔다가, 함수가 종료되면 메모리상에서 사라진다.


이제 반복문 for 의 함정을 이야기 할수 있을 것 같다. 반복문은 시작과 종료를 중괄호로 되어있다. 즉, 함수이므로 반복문 안에서 지역변수 선언이 가능하다(함수라고 말해도 되는지는 정확히 모르겠지만 지역변수 선언 가능). 따라서 지역변수가 선언 되었을 때 메모리로 저장되고 반복문을 종료할 때 똑같이 메모리상에서 삭제 된다. 그런데 for 문은 종료할 때가 언제일까? 

  1. for( i = 0 ; i< 3 ; i++ )
  2. {
  3. int a = 0;
  4. a++;
  5. printf("%d \n",a);
  6. }

이런 문장을 실행했을 때 오류가 떠야 정상일 것이라 생각할 수도 있다. 왜냐하면 int a 가 선언 되었는데 계속해서 선언을 하게 되므로 오류가 발생할 것이다. 그러나 실제로 컴파일 하보면 오류가 발생하지 않는다. 그 이유는 for 문은 두 번째 줄 부터 여섯 번째 줄 까지 전부 실행하고 괄호를 탈출한 뒤 다시 조건문부터 실행하기 때문이다. 괄호를 탈출 한다는 것은 함수가 끝는 다는 것과 같고 그러므로 메모리에 저장되 있던 지역변수가 메모리상에서 사라지게 된다. 메모리상에서 사라지게 되므로 i 가 0 일때 생성 되었던 int a 는 소멸하고 다시 i 가 1 일때 새로운 int a 가 메모리상에 저장 되는 것이다.
참고로 위 예제를 실행하면 아래와 같이 된다.
1
1
1

- for 문의 종료는 for 문 내용을 전부 실행한 후 for 문을 완전히 탈출한 다음 다시 조건부터 시작한다.


'Language > C언어' 카테고리의 다른 글

선언(declaration)과 정의(definition)의 차이  (0) 2013.11.08
C언어 따옴표의 의미  (0) 2013.11.06
강제 형 변환  (0) 2013.10.23
컴파일과 링크의 차이  (0) 2013.10.23
라이브러리와 헤더파일의 차이  (0) 2013.10.23
Posted by 나무길 :