신비한 개발사전

연산자 적용 방식 정리 본문

카테고리 없음

연산자 적용 방식 정리

jbilee 2023. 7. 14. 16:30

프로그래밍 언어에 사용되는 연산자를 공부하다가 난해한 문제를 만나버렸다.

 

++x+++y

 

연산자가 어디에 몇 개가 붙느냐에 따라서 숫자들이 더해지기도 하고 덧셈 뺄셈이 안되거나 아예 오류가 나기도 하는데.. 특히 증감 연산자가 있을 경우 혼란이 가중된다. 코딩할 때 혼선이 없도록 정리하자.

 

아래와 같은 문제가 주어졌을 때:

var x = "5";
var y = 10;

console.log(x+++y); // 15 출력
console.log(++x+++y); // 에러

 

첫번째로 찍히는 console 로그는 숫자가 출력되는데, 두번째는 에러가 발생한다.

첫번째 문제는 어떻게 계산해야 할지 컴퓨터가 이해할 수 있지만, 두번째 문제는 그렇지 않기 때문이다.

 

x+++y

  • 같은 연산자 3개가 연속으로 있기 때문에 이 문장은 `x + ++y` 또는 `x++ + y`로 해석될 수 있다.
  • 더하기 연산자(+)와 증가 연산자(++) 중 증가 연산자가 더 높은 우선권을 가진다.
  • 따라서 컴퓨터는 위 문장을 `x++ + y`만으로 이해하고, 비록 x의 값은 문자열의 형태를 하고 있지만 숫자로만 이루어진 문자이기 때문에 JavaScript는 "5"를 숫자로 여긴다.
  • `x+++y`를 해석하면 `5 + 10`이 되고, 콘솔에는 15가 우선 출력되지만 같은 연산을 반복하면 증가 연산자로 인해 1씩 증가된 결과값이 출력되게 된다. (16, 17, 18...)

++x+++y

  • 더 높은 우선권을 가진 증가 연산자가 이미 한번 x의 앞에 붙었기 때문에 이 문장은 `++x`와 그 뒷부분(`+++y`)으로 해석된다.
  • `++x`는 정상적으로 계산되지만, 뒷부분만 봤을 때 `+++y`는 모호성을 가진다. 띄어쓰기를 추가해서 `+ ++y`로 명확하게 구분해주지 않는 이상 컴퓨터는 +++를 해석할 수 없고, 따라서 오류를 발생시킨다.

 

추가로 찾아보니, 위 예제처럼 모호성을 가진 수식을 파싱할 때 우선권 등을 고려하는건 컴파일러마다 상이한다고 한다.

JavaScript의 경우 +++처럼 이어진 연산자는 모호성을 가지기 때문에 명확하게 나누지 않는다면 오류가 발생한다.