본문 바로가기

증감 연산자 increment decrement operators 본문

💘 C++/연산자들

증감 연산자 increment decrement operators

Hyonii 2021. 12. 31. 00:20

증감 연산자 increment / decrement operators

Operator Symbol Form Operation
Prefix increment (pre-increment) ++ ++x Increment x, then evaluate x
Prefix decrement (pre-decrement) -- --x Decrement x, then evaluate x
Postfix increment (post-increment) ++ x++ Evaluate x, then increment x
Postfix decrement (post-decrement) -- x-- Evaluate x, then decrement x

전위 증감 연산자(prefix increment/decrement operator)는 매우 간단하다.

증가 또는 감소한 다음 x 값을 평가한다.

#include <iostream>

using namespace std;

int main()
{
	int x = 5;
    int y = ++x;
    
    cout << y << endl;
    
    return 0;
    
   }
   
   //This produces the result:
   //6
   //x에 1이 더해진 값이 y에 들어간다
#include <iostream>

using namespace std;

int main()
{
	int x = 6, y = 6;
    
    cout << x << " " << y << endl;
    cout << ++x << " " << --y << endl;
    
    return 0;
    
 }
 
 //This produces the result:
 //6 6
 //7 5

 

후위 증감 연산자(postfix increment/decrement operator)는 조금 더 까다롭다.

컴파일러는 x 의 임시 복사본을 만들고, 원본 x를 증가시키거나 감소시킨 다음 x 의 임시 복사본을 평가한다. 

그 다음 x의 임시 복사본이 삭제된다.

 

#include <iostream>

using namespace std;

int main()
{
	int x = 6, y = 6;
    
    cout << x << " " << y << endl;
    cout << x++ << " " << y-- << endl;
    cout << x << " " << y << endl;
    
    return 0;
  }
  
//This produces the result:
//6 6
//6 6
//7 5

 

x 앞에 ++가 붙는 경우는 x에다가 먼저 1을 더한 다음에 출력한 것

x 뒤에 ++가 붙는 경우는

cout << 에다가 x 를 보내서 ++하세요 라고 한 다음에 

그 다음에 x에 1이 더해지는 것 까지 작동하는 것

그 다음에 x에 1이 더해진 값이 나오는 것

 

#include <iostream>

using namespace std;

int main()
{
	int x = 6, y = 6;
    
    cout << x << " " << y << endl;
    cout << ++x << " " << --y << endl;
    cout << x << " " << y << endl;
    cout << x++ << " " << y-- << endl;
    cout << x << " " << y << endl;
    
    return 0;
  }
  
//This produces the result:
//6 6
//7 5
//7 5
//7 5
//8 4

사이드 이펙트 (Side effects)

: 함수 또는 표현식이 특정 상태(Ex. 메모리에 저장된 정보)를 수정하거나 입력 또는 출력하거나 다른 함수를 호출하는 것을 말한다.

 

ex) 

x = 5;

++x;

cout << x;

 

위 예제에서 할당 연산자( = )는 x의 값을 변경하는 사이드 이펙트를 가진다.

명령문이 실행 완료된 후에도 x는 값이 5이다.

연산자 ++는  x 값을 증가시키는 사이드 이펙트가 있다.

x의 출력은 콘솔을 수정하는 사이드 이펙트를 가진다.

 

그러나 사이드 이펙트는 예상치 못한 문제를 일으키기도 한다.

 

undefined behavior:

#include <iostream>

using namespace std;

int add(int a, int b)
{
	return a + b;
}

int main()
{
	int x = 1;
    int v = add(x, ++x) // do not use 이렇게 코딩하지마
    
    cout << v << endl;
    
    return 0;
 }
 
 //This produces the result:
 //4

C++은 함수 인수를 평가하는 순서를 정의하지 않았다.
만약 왼쪽 인수를 먼저 평가하면 add(1, 2)을 호출하여 3을 반환하고,

오른쪽 인수를 먼저 평가하면 add(2, 2)이 되어 4를 반환한다.

add() 함수에 대한 인수 중 하나가 사이드 이펙트를 가지고 있기므로 이런 문제가 생긴다.

 

#include <iostream>

using namespace std;

int main()
{
	int x = 1;
    x = x++;
    
    cout << x << endl;
    
    return 0;
}

//This prodeces the result:
//2

정의되지 않은 동작(undefined behavior)

프로그래밍 언어에서 동작이 제대로 정의되지 않은 코드를 실행한 결과를 말한다.

할당 전에 ++ 연산자가 먼저 적용되면 1이 출력된다.

(후위 연산자 ++는 x를 1에서 2로 증가시키지만 1로 평가되므로 표현식은 x = 1 이 된다.)

할당 후에 ++ 연산자가 적용되면 2가 출력된다.

(x = x 로 평가한 다음 ++를 적용하여 1에서 2로 x가 증가한다.)

위와 같은 문제들은 사이드 이펙트가 적용된 변수를 한 명령문에서 두 번 이상 사용하지 않음으로써 모두 피할 수 있다.

Comments