본문 바로가기
javascript

i++와 i+=1의 차이점?

by 아촌 2022. 4. 5.

제로초의 강의 반복분 부분에서 i++ 와 i+=1은 나중에 깊게들어가면 다르다는걸 느끼실수있다고했다.

 

무엇이 다른가

++와 +=1 의 속도차이

2004.07.12 17:54

변수 $i를 가정하고

$i++ 과 $i+=1 은 $i를 1증가시키는 구문입니다.

과연 저 둘이 실제상황(?)에서 속도차이를 보일까 하는 의문에서
간단한 실험을 했습니다.

일단

for($i = 0; $i < 1000000; $i++); 와

for($i = 0; $i < 1000000; $i+=1); 를 따로 실행해서
마이크로초 단위로 실행시간을 계산해본 결과,


$i++ 일때

0.87869
0.859785
0.93886
0.882139
0.924311
0.872625
0.866393
0.890392
0.889265
0.866099
0.861506
0.880137

$i+=1 일때

0.928549
0.950968
0.995221
0.954347
0.941408
0.940832
0.957434
0.990631
0.936167
0.963263
0.966622
0.98165

백만번 루프에서 0.1초 이내의 차이가 나는것이 확인되었습니다.
아마도 파서에의해 번역될때,
++는 어셈블리 INC ecx 명령으로 번역되고,
+=1은 어셈블리 ADD ecx, 1 정도로 번역된다고 생각합니다.

저 둘의 처리 속도차이로 이와같은 결과가 생긴다고 생각되는군요. (;)

역시 크게 신경쓰문제는 아닐듯 합니다.
 
 
그렇다고한다..?
 

 

누군가가 ++보다 += 1을 선호하는 이유를 알고 싶다면 최근 Swift(iOS 프로그래밍용) 변경이 훌륭한 설명을 제공합니다.

Swift는 ++ 연산자를 완전히 없앴습니다. 다음은 Swift의 창시자인 Chris Latner가 인용한 이유입니다.

 


 

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
참고
 

++와 +=1 의 속도차이 - 웹마스터 팁 - XpressEngine

변수 $i를 가정하고 $i++ 과 $i+=1 은 $i를 1증가시키는 구문입니다. 과연 저 둘이 실제상황(?)에서 속도차이를 보일까 하는 의문에서 간단한 실험을 했습니다. 일단 for($i = 0; $i < 1000000; $i++); 와 for($i

xe1.xpressengine.com

 

https://velog.io/@alstnsrl98/%EC%99%80-1%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

++와 += 1의 차이

\++와 += 1의 차이점을 파악한다.프로그래머스 1단계 문제 중 '모의 고사'라는 문제를 해결하던 중아래의 코드를 간결하게 만들고 싶었다. 그런데 다음과 같은 문제가 발생했다.이 문제가 발생하

velog.io

 

'javascript' 카테고리의 다른 글

forEach , map 알아보기  (0) 2022.04.18
textContent , innerText 차이  (0) 2022.04.09
HTMLCollection vs NodeList  (0) 2022.04.01
프로미스(Promise)의 장점  (0) 2022.03.28
자바스크립트 공백제거 (replace,trim)  (0) 2022.03.25