본문 바로가기
컴퓨터/디버깅

for 문의 동작 순서

by adnoctum 2010. 5. 19.

다음과 같은 곳에서 에러가 났다.

환경 : Visual C++ 9.0 (VS2008) on Windows XP SP2



수행하다 문제가 생긴 곳을 알려 주는 노란색 화살표가 가리키는 곳을 보면 range 를 검사하다 문제가 생긴 것 같다. 위 코드는 vector 파일이고, 보아 하니 operator-- 를 호출하는 과정에 에러가 난 것으로 보인다. 왜 그런지 다시 call stack 을 따라서 내가 작성해 놓은 코드로 가보면,


위와 같다. 403 번째 줄을 실행중이라는 것을 알 수 있는데, 그 줄에서 vector의 iterator 형 변수인 [pos_x]와 [pos_y]가 operator-- 를 호출하는 것을 볼 수 있고 이것은 위에서 살펴 본 코드 (vector 파일) 와 이야기가 맞아 떨어진다. range가 잘못되어 있고 operator-- 를 호출하다 에러가 났으므로 [interapolated_x]의 begin 위치에서 한 칸 왼쪽(말하자면)으로 가려 했기 때문에 에러가 났다고 생각할 수 있다. 왜 그랬을까?

[Tmax_step] 은 정수형이며 0 < [Tmax_step] <= ([interpolated_x].size() - 1) 의 값을 갖는다. 즉, [Tmax_step] 값은 잘못될 수 없다. 다시 for 문을 잘 보면 k 가 0 일 때 [pos_x]와 [pos_y]는 각각의 값이 가질 수 있는 최소값(즉 vector 형 변수의 begin 위치) 을 갖고 있다. 따라서 문제는 k 가 0 보다 작아진 경우에 발생했을 것이다. 맞다. 만약 위 코드의 403번째 줄에서 [pos_x]와 [pos_y] 를 제외했다면 403번째 줄의 for 구문이 끝난 이후 k 값은 -1 이다. 그것은 for 문의 동작 순서 때문이다.


for 문은

for( 식1 ; 조건1 ; 식2)
{
   코드 1
}

과 같은 형태를 가지며, 실행 순서는

식1 수행 --> 조건1 검사 --> 코드1 수행 --> 식2 수행 --> 조건1 검사 --> 코드1 수행 --> 식2 수행 --> 조건1 검사 ...

이며, 조건 1의 값이 0 이면 (C/C++에서의 false) for 문을 끝내게 된다. 종종

식1 수행 --> 조건1 검사 --> 코드1 수행 --> 조건1 검사 --> 식2 수행 --> 코드1 수행 --> 조건1 검사 --> 식2 수행 ...

으로 실행 순서를 착각하는 사람이 있는데, 그렇지 않다.


다시 위에서 에러가 난 코드로 돌아가 보면,
 

403 for(; k >= 0; k--, pos_y--, pos_x--){

위 구문에서,  식2 부분인 k--, pos_y--, pos_x-- 부분을 생각해 보자. k 가 현재 1 이고 [pos_x],[pos_y] 가 begin+1 위치에 있는 상황이라고 해보자. 코드1 부분이 수행되고, 식2가 수행되면서 k 가 0, [pos_x],[pos_y]가 begin 위치로 바뀌었다. 그 후 조건1 이 검사되는데 k >= 0 은 참이기 때문에 코드1 부분이 수행된다. 그 후 식2 부분이 수행되면서 k가 -1 이 되는데, 이 때

pos_y--,pos_x--

가 같이 수행되면서 에러가 난 것이다.

해결책은 k를 감소시키는 부분과 pos_x, pos_y 를 감소시키는 부분을 한 단계 앞에서 끝내는 것이다. 지금 현재 저 코드에서는 k 를 사용하고 있지 않으니까....

403 for(; k > 0; k--, pos_y--, pos_x--){

수정된 코드. k 가 0 보다 크거나 같을 때, 에서 클 때로 수정되었다.