++와 += 1의 차이점을 파악한다.
프로그래머스 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 | ( ), [ ] | 괄호, 대괄호 |
| 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