비주얼 베이직(이하 VB)은 꽤 잘 만든 것 같은 언어지만 의외로 대단히 허접한 구석이 있다. 조건절을 평가할 때, 가령 다음과 같은 경우가 있다.
if P and Q then
    something()
end if

위와 같은 경우 P가 참이고 Q가 참이면, 즉 둘 다 참이어야만 그 안의 구문이 실행되고 그 외에는 실행되지 않는다. 따라서 P가 거짓인 경우 Q를 평가할 필요 없이 그냥 실행을 안해도 된다. 하지만 VB에서는 굳이 Q까지 평가한다. 이래서 난감한 경우가 있는데...

P에는 "A라는 변수가  메모리에 자리를 잡고 있는가? (malloc같은걸로 잘 잡혀 있느냐는 질문)"가 들어가 있고, Q에는 "A가 10보다 큰 수인가?"라는 질문이 들어가 있다고 하자. 그럼 P가 안되면 Q는 평가할 필요가 없으므로 그냥 잘 넘어가면 되지만 VB에서는 실행하다가 오류가 난다(Q에서 평가해야 할 A가 메모리에 어디에 있는지 알 수가 없으므로). 따라서 이런 경우에는 if구문을 2중으로 써야 한다.
if P then
    if Q then
    something()
    end if
end if

이게 VB에서만 그런건지 VC++에서도 그런건지 모르겠다. 난 VC++는 배워본적이 없다. (윈도우즈 프로그래밍이라는 과목에서 구경은 했지만...)

어쨌든 내가 아는 C에서는 위와 같은 경우 2중으로 쓰지 않아도 되지만 VB에서는 2중으로 써야 한다.
이것때문에 하루동안 삽질한 날이 많아서 기록해 둔다.

*추가 : and 대신에 andAlso를 쓰면 중지연산이 된다. 즉, 앞에 있는게 false면 뒤쪽을 판정하지 않고 곧바로 전체를 false로 해 준다. 하지만 이미 늦은... 중지 연산 써야 할 부분은 대부분 잘 구현되었다.
by snowall 2009. 9. 24. 14:04