:: 진공에 대해 알려주마.

C, C++ Operator "=+" 본문

비정기 피엠

C, C++ Operator "=+"

하이백 2022. 4. 20. 12:44

C, C++ 연산자 중에서 =+를 본 적이 있는가? 서비스를 위하여 코드를 보던 중 이런 부분을 발견하였다. 나름 전공자이고  Turbo-C부터 C를 배웠으며 나름 오랫동안 업계에 몸담고 매일같이 코드를 보아 왔지만 이걸 보고 아직 멀었다는 자괴감(?)이 든다. Syntec error가 발생하지 않는 것은 문법은 이상이 없다는 뜻인데 정상 동작은 하지 않는다. 이게 뭘까 하고 고민을 하다 이것저것 뒤져 보니 재미있는 내용이 있어 여기에 기록해 본다.

우선 컴파일 중 문법 에러가 발생하지 않는다. 
타이머 기능으로 구성한 것으로 보이는데 정상 동작은 하지 않는다.
단순 오류라 하기에는 여러 군데 사용하였다. (전부 한 군데서 복붙 한 건가?)
결론부터 말하면 지금은 사용치 않는 연산자이며 버그이다.

 

1. 현상

VC++ 6.0 Code 리뷰중 =+ 를 발견하였다. 뭐지.?

 

2. 확인

환경이 VC++6.0이다. 그래서 6.0에서 테스트해 보았다. 결과는 아래와 같고 =+는 =와 동일한 효과를 나타낸다. 문법 에러는 없다. 찾아본 바로는 다음과 같이 동작한다고 한다.

n =+ 1;   ->   n = (+1);               // 아래 내용을 보면 동일한 결과를 얻었다. 

VC6.0에서 테스트 결과 =+는 =와 같다.

 

3. 역사

연산자 =+가 사용된 역사는 stackoverflow에서 찾았다. 1979년 UNIX 매뉴얼에 정의되어 있다고 한다.

초기에는 =+와 =+는 같은 의미로 사용되었다가 문법의 혼선 등으로 해당 기능이 삭제되었다고 한다. 예로 x변수에 -1을 치환하려는 의도와 x에서 1을 빼기 하려는 의도가 구분이 안 되는 모호한 형식으로 이를 활당의 의미로 변경한 것으로 보인다.

당연히 현재는 위에서 의도한 a=a+50이 아니라 a=50으로 동작하게 된다. 해당 타이머 루틴은 무한 루프에 빠지게 된다. 업계에서 이야기하는 무언 정지가 발생한다.

 

4. 처리

해당 연자자는 오타로 의도대로 되지 않는다. 불가능하다. 당연히 =+를 +=로 수정하면 원하는 동작은 할 것으로 보인다. 하지만 생각대로 동작하지 않는다. 그래서 특단의 조치를 취해 해당 시퀀스가 정상 동작하도록 수정하였다. 

1970년대 unix에서 이 코드를 보았다면 정상 동작했을지 몰라도 지금의 환경에서는 동작하지 않는다. 아니 의도와는 다르게 동작한다. 단순 실수로 보인다. Syntax error가 발생하지 않아 해당 문제를 확인하지 못하였으며 또한 센서가 정상 동작하여 해당 루틴의 검증도 못했을 것이다.

해당 센서가 제대로 GetFocus 하면 해당 타이머가 동작 없이 다음 시퀀스로 넘어가게 된다. 그래서 문제점이 확인이 안 된 듯하다. 물론 센서에 문제가 발생하면 담당자가 한 번은 현장에 끌려갔을 듯 하지만...

우연히 본 별거 아닌 코드 한 줄에 호기심으로 찾아본 이력에는 많은 역사가 담겨있다. 초기 컴파일러 개발자의 수고가 엿보인다. 사용 중 문제점이 발견되면 이를 효율적으로 개선하여 사용이 쉽게 만들고자 하였으며 오류가 발생치 않도록 계속 보완해 갔을 것이다. 그러한 사람들의 노력으로 더 좋은 개발 환경을 제공하는 것 같다.

'비정기 피엠' 카테고리의 다른 글

코딩  (0) 2022.12.09
필요할땐 안보이는 그거.  (0) 2022.10.10
RS-232 to TTL  (0) 2022.02.09
C# Read InBuffer  (0) 2021.06.22
구글 지메일 외부에서 접근하기  (0) 2021.03.11
Comments