인프런 커뮤니티 질문&답변

김민기님의 프로필 이미지

작성한 질문수

자바스크립트 비기너: 튼튼한 기본 만들기

7. 후치, 전치, 논리 NOT 연산자

후치 연산자

21.02.18 14:17 작성

·

187

2

전치 연산자는  문장 안에서 1 증가는 그렇다 쳐도, 후치 연산자는 세미 콜론 다음에 감소한다는 것은 잘못된 설명 같습니다. 

예를 들어,

var one =  1;

console.log( one ++);

처럼 단편적으로 후치 연산자 하나만 실행 했을 때는 세미콜론 다음에 감소하는 것처럼 보일 지는 몰라도

var one =  1;

console.log( one-- + ++one );

과 같이 실행 했을  때,  후치 연산자가 문장을 수행한 후에 감소한다면 이것의 결과는 1+2가 되어 3이 되어야겠죠. 하지만 실행 결과는 2 입니다. 왜냐하면  one-- 이후에 one은 0이고 ++one에서 one은 또다시 1이 되어서 1+1 = 2 라고 생각이 드네요.

 그러니까 후치연산자도 결국 문장안에서 실행된다고 표현하시는게 맞지 않을까요? 다만 이것도 표현식을 평가한 후에 1 증가 또는 감소라고 하는 편이 맞는 것 같다고 생각합니다.  

답변 1

3

김영보님의 프로필 이미지
김영보
지식공유자

2021. 02. 18. 17:18

좋은 질문입니다. 자바스크립트 스펙에 아래와 같이 기술되어 있습니다.
When a ++ or -- token is encountered where the parser would treat it as a postfix operator, and at least one LineTerminator occurred between the preceding token and the ++ or -- token, then a semicolon is automatically inserted before the ++ or -- token.

----------
var one = 1, two = 2;
console.log(one-- + ++two);  // 결과: 4
console.log(one) // 값: 0

4가 되려면 one--를 실행하지 않고 1이어야 합니다. 또한, 3번째 줄의 console.log(one)의 값은 0입니다. console.log(one-- + ++two);를 실행할 때는 one--를 하지 않고 (1 + 3)을 한 후, 세미콜론에서 one--를 했다고도 볼 수 있습니다. 아래 코드에서 결과는 7이며 (1 + 3 + 3) 형태가 되어야 7이 될 수 있습니다. 두 개의 결과에서 one--는(은) 세미콜론을 만났을 때 실행한다고 볼 수 있습니다.
지금까지 결과로 보면 console.log(one-- + ++two);  형태는 생각한 것과 다르게 결과가 나올 수 있다는 것입니다. 코드의 가독성을 위해 사용하지 않는 것이 나을 것 같습니다.

var one = 1, two = 2, three = 3;
console.log(one-- + three-- + ++two);  // 결과: 7

김민기님의 프로필 이미지
김민기
질문자

2021. 03. 02. 14:35

제 질문 의도가 잘 전달되지 않은 것 같습니다. 

var one = 1;

console.log(one, one-- + ++one, one, --one);

한 번 이 경우에 대해서 생각해보죠. 

말씀하신 것 처럼 one--가 세미콜론을 만났을 때 실행한다고 볼 때,  로그의 두번째 인자는 1+2가 되어 3이 출력되어야 합니다. 

하지만 결과는 2이고 로그 세번째 인자에서 1로 출력됩니다. 

그러니까 두번째 인자에서

1 +  ( 0 ( 1-- ) →  1 ( 0++ ) )  + 1       ( 중간 괄호는 one 변수의 연산 과정 )

로 2인 것 같습니다. 따라서 후치연산자도 세미콜론을 만나야 실행되는 것이 아닌, 문장 중간에 실행된다 라고 표현하는 것이 더 맞다고 생각듭니다. 

강의 잘 듣고 있습니다.