[C] do { } while ( false, false ); Lu's…〃 Programing。


얼마 전에 트위터에 적었던 do { } while ( false, false ); 문에 대한 이야기를 여기에 다시 정리한다.


-------------------------------------------------------

 코딩을 하다 보면, 로직 중간에 탈출할 필요가 생긴다. 가장 좋은 방법은 함수를 만들어 로직을 분리하는 방법이지만, 로직에서 변경하는 변수가 한두개가 아니다보면 골치가 아파온다. 이 때 사용하는 기법은 C에서 몇 가지가 있다.

  1. goto

    이 얼마나 깔끔하고 완벽한 방법인가! 중간에 어디로 가야한다? 그러면 goto지!

    ...하지만 아직도 goto를 보면 경기를 일으키며 호환마마보다 무서워하는 사람들이 많은데, 옛날에는 오죽했을까.
    다음 방법들은 어떻게든 goto를 쓰지 않기 위한 처절한 몸부림이다.

  2. switch - break 문

    어차피 반복할 필요 없으면 switch (1) { default: ~~~ } 구문이면 해결된다. 중간에 break; 만 넣으면 된다.

  3. do ~ while 문

    2와 동일하다. 어차피 do 구문은 실행되기 때문에 while ( 0 ) 로 그냥 빠져나오면 된다.


내가 본 코드는 do - while 문을 썼는데, 여하튼 저런 이유로 사용했었다. 그러면 두 번 째 이상한 거. false, false. 얘는 뭘까?

컴파일러 옵션에서 경고 수준(/W) 4에서는 C4127 경고가 발생한다. 이 경고가 뭐냐며는 '조건식이 상수입니다.'

 swich( 1 )이나 while ( false )의 경우에는 이런 경고가 뜬다. 무작정 경고를 disable하는 것은 또 프로그래머의 미학에 어긋나는 법. 옛 고인물들은 답을 찾았다.

 답은 알고 있으니까 우선 "," 쉼표 연산자에 대해 알아보자.

 쉼표 연산자는 쉼표로 이어진 모든 표현식(expression) 중 가장 오른쪽에 있는 식만을 반환한다. 왼쪽부터 처리는 되는데, 실제 사용되는 값은 가장 오른쪽 식의 반환값이다. 그러니까 int a = (1,2,3,4); 에서 a = 4이다. 

 이 쉼표 연산자가 자주 쓰이는 구문이 for문이다. 프로그래밍 시작했을 당시에 이렇게 쓰는 사람 많았을걸.

    int x, y;
    ...
    for (x = 0, y = 0; ... )

 여하튼, 이 연산자는 최종적으로 가장 오른쪽 식을 반환하지만 왼쪽 식에서 어떤 연산을 했는지는 알 수 없다. 아마 이런 이유 때문에 /W4에서 경고가 동작하지 않는 것 같은데, 나도 확실히는 모르겠다. 정확히 알고 계신 분은 댓글로 남겨주세요 ㅎㅎ...





 ps. 이 트윗 스레드를 올리고 나서 수많은 인용 멘션으로 '차라리 goto 쓰고만다' 'goto 모르나? 츄라이츄라이' 같은 멘션들이 마구마구 달렸는데, 저도 goto 좋아하구요, 이렇게 안 짤거구요, 저는 C++ 유저기 때문에 람다라는 매에에에에우 좋은 대체제가 있읍니다.........

 ps. 최신 언어들은 이런 짓 안 해도 되는 클로저를 제공해줍니다. 예를 들어 C++11부터 추가된 람다. [&](){ ... } 안에 모두 담아버리면 됨. AWESOME.





덧글

댓글 입력 영역