증감 연산자 increment decrement operators 본문
증감 연산자 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가 증가한다.)
위와 같은 문제들은 사이드 이펙트가 적용된 변수를 한 명령문에서 두 번 이상 사용하지 않음으로써 모두 피할 수 있다.
'💘 C++ > 연산자들' 카테고리의 다른 글
논리 연산자 Logical Operators (0) | 2022.01.03 |
---|---|
관계연산자 Relational Operators (0) | 2022.01.03 |
Sizeof, 쉼표 연산자, 조건부 연산자 (0) | 2022.01.02 |
산술 연산자 arithmetic operators (0) | 2021.12.29 |
연산자 우선순위와 결합 법칙 (0) | 2021.12.29 |