비주얼 베이직(이하 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.09.24 14:04
  • 이경문 2009.10.14 06:01 ADDR EDIT/DEL REPLY

    short circuit evaluation을 추구한다면 프로그램 수행의 입장에서 최적화의 장점은 있겠지만, (A and B) 와 (B and A)의 수행 결과가 달라 질 수 있기 때문에 교환법칙이 성립되지가 않죠(B가 단순 변수의 확인이 아니고 또 다른 함수의 수행이고 그 속에서 중요한 어떤 일을 하게 된다면). 순수한 수학의 입장에서 봤을 때에는 standard boolean operator 방식을 사용하는 것이 옳을 수도 있습니다.

    따라서, short circuit evaluation 방식과 standard boolean operator 방식중에 어떤 것을 선택하느냐에 대한 고민은 언어 및 컴파일러 디자이너에게 큰 고민거리가 되어 왔습니다. 말씀하신 문제점을 VB 제작자가 그걸 모를 리가 없습니다. 호환성을 위해 어쩔 수 없이 그렇게 할 뿐...

    전 세계에서 널리 사용되는 모든 프로그래밍 언어는 ambiguity를 가지고 있습니다. 하나의 fact만으로 "VB는 허접한 구석이 있다"라고 얘기하는 것은 좀 그렇네요.

    노련한 개발자는 이러한 short circuit evaluation으로 인한 코드 실행상의 ambiguity를 없애기 위해 부득이하게 if 문을 여러번 쓰고 있습니다.

    • snowall 2009.10.14 10:40 신고 EDIT/DEL

      저는 그다지 노련한 개발자가 아니고, 머리가 나빠서 2중으로 if문을 써야 한다는 것도 시간이 지나면 잊어먹기 때문에 편한게 좋습니다.
      이것때문에 며칠씩 까먹고 있는데 삽질하다보면 어쨌든 VB는 허접하단 생각밖에 안들게 됩니다. 저는 그냥 제 관점에서만 보거든요.
      제가 C랑 포트란 정도 읽다가 초보자를 위한 VB 입문서 책 하나 보고 시작한 VB라, C랑 다르면 일단 짜증부터 납니다. 원래 VB는 손댈 생각도 없다가 업무때문에 하는거라...