++와 += 1의 차이

민순기·2021년 12월 15일

Goal

++와 += 1의 차이점을 파악한다.

Why? (주제 선정 이유)

프로그래머스 1단계 문제 중 '모의 고사'라는 문제를 해결하던 중
아래의 코드를 간결하게 만들고 싶었다.

  if (answers[answer] === supoza[supozaNum][answer % supoza[supozaNum].length]) {
  score[supozaNum] += 1;
}

그런데 다음과 같은 문제가 발생했다.

// 얘는 되는데
(answers[answer] === supoza[supozaNum][answer % supoza[supozaNum].length]) && score[supozaNum]++;

// 얘는 안된다.
(answers[answer] === supoza[supozaNum][answer % supoza[supozaNum].length]) && score[supozaNum] += 1;

이 문제가 발생하는 원인에 대해 글을 적고 싶어서 주제를 선정했다.


++ 와 += 1의 차이

이 둘의 차이를 알기 위해서는 연산자들의 우선 순위를 알아야 한다.

우선순위연산자내용
1( ), [ ]괄호, 대괄호
2!, ~, ++, --부정 / 증감 연산자
3*, /, %곱셈 / 나눗셈 연산자
4+, -덧셈 / 뺄셈 연산자
5<<, >>, >>>비트단위의 쉬프트 연산자
6<, <=, >, >=관계 연산자
7==, !=
8&비트단위의 논리 연산자
9^
10|
11&&논리곱 연산자
12||논리합 연산자
13?:조건 연산자
14=, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, ~=대입 / 할당 연산자

보다시피 할당 연산자인 +=의 우선 순위가 가장 낮다.

때문에

(answers[answer] === supoza[supozaNum][answer % supoza[supozaNum].length]) && score[supozaNum] += 1;

에서 && 연산이 += 보다 먼저 일어나기 때문에 오류가 발생한 것이다.

이 코드가 정상 작동하기 위해서는 score[supozaNum] += 1; 을 괄호로 묶어줘야 한다.

(answers[answer] === supoza[supozaNum][answer % supoza[supozaNum].length]) && (score[supozaNum] += 1);

번외

위와 비슷하게 우선순위로 인해 발생할 수 있는 몇몇 사례를 준비해봤다.

let a = 1;
const b = a++;
const c = ++a;

console.log(`a = ${a}, b = ${b}, c = ${c}`); // a = 3, b = 1, c = 3

/* a는 증감 연산자의 영향으로 2가 증가되어 3이 되었다.
b는 a++인데 증감 연산자가 피연산자의 뒤에 있기 때문에 b에는 1이 할당되고 이후에 a가 1증가한다.
c는 증감 연산자가 피연산자의 앞에 있기 때문에 c에는 a에서 1이 증가한 3이 할당된다.*/
let a = 1;
const b = 1 + ++a;

// 이 경우에는 증감 연산자가 먼저 실행된 후에 덧셈을 한다.
console.log(`a = ${a}, b = ${b}`); // a = 2, b = 3
profile
2년차 FE 개발자 민순기입니다.

0개의 댓글