Operator

Arithmetic OP(산술 연산자)
후위 증가    x++;
후위 감소    x--;

전위 증가    ++x;
전위 감소    --x;
단항 덧셈    +x;
단항 뺄셈    -x;

곱셈            x*y;
나눗셈        x/y;        두 인자가 모두 정수라면, 결과의 소수 부분을 버림(내림)
나머지        x%y;        두 인자가 정수형이어야 함

이항 덧셈     x+y;
이항 뺄셈     x-y;
증감 연산자는 변수의 값만 변하고 임시 결과의 값은 변하지 않음
int i=3;
i++;
const int j=5;
j++; // , j
(3+5)++; // , 3+5
증가 및 감소 연산은 수정 가능하고, 주소를 지정할 수 있는 변수가 필요하다.
이 때 주소를 지정할 수 있는 항목을 Lvalue라고 한다.(i, j는 Lvalue 하지만, j는 상수임)

일반적으로 수식에서 증가나 감소의 사용을 자제하고, 증가/감소를 분리하는 것이 좋음(사이드 이펙트를 줄임)
소수 부분을 버리는 방법이나, 오버플로를 처리하는 방법 등 연산자 동작의 세부사항을 언어 표준으로 정하지 않는다.
C++은 주로 성능 상의 문제로 하드웨어 업체들에게 맡긴다.
이항 연산에서 두 인자가 서로 다른 타입을 가질 때, 하나의 인수 또는 두 인수 모두 규칙에 따라 일반적인 타입으로
자동(강제) 변환된 후, 연산된다.

변환은 정밀도의 손실을 초래함
long l=1234567890123;
long l2=l+1.0f-1.0; //
long l3=l+(1.0f-1.0); //
Bool OP(불 연산자)
not            !b;

크다            x>y;
크거나 같다    x>=y;
작다            x<y;
작거나 같다    x<y;
같다            x==y;
같지 않다        x!=y;

논리적 AND    b&&c;
논리적 OR       b || c;
논리 표현식에서는 항상 bool 타입을 사용할 것
//
// bool in_bound = min<=x<=y<=max;
//
bool in_bound = min<=x && x<=y && y<=max;
Bit OP(비트 연산자)
NOT(1의 보수)        ~x
왼쪽 시프트            x<<y
오른쪽 시프트        x>>y

비트 AND            x&y
비트 OR               x|y
비트 XOR             x^y
비트가 시프트 된 만큼 빈 공간은 대부분 0으로 채워짐, 음수 값의 비트를 오른쪽으로 이동하는 경우 1로 채워

AND는 특정 비트를 검사하는데 사용
OR은 비트 값을 설정하는데 사용
XOR은 비트 값을 뒤짚는데 사용할 수 있다

AND OR XOR은 시스템 프로그래밍에서 많이 사용된다.
할당 연산자
x=y
x*=y
x/=y
x%=y
x+=y
x-=y
x<<=y
x>>=y
x&=y
x|=y
x^=y
개체(수정 가능한 Lvalue)의 값은 할당 연산자를 통해서 설정할 수 있다.
object=expr;
위에서 object와 expr의 타입이 일치하지 않을 경우, 가능하다면, expr의 타입을 object의 타입으로 변환 후,
object에 할당한다.

할당 연산자는 오른쪽에서 왼쪽으로 할당하기 때문에 아래와 같이 표현할 수 있다.
o3=o2=o1=expr;
할당 연산자는 모든 산술 연사자 또는 비트 연사자 보다 낮은 우선순위를 가지기 때문에 오른쪽에 있는 표현식은
항상 할당을 수행하기 전에 처리된다
a*=b+c; // same as a=a*(b+c);
Program Flow
C++에서 프로그램의 흐름을 제어하는 연산자는 세 가지(함수, 조건 연산자, 콤마 연산자)이다
함수
조건 연산자: c?x:y는 조건 c가 참일 경우, x를 거짓일 경우 y를 리턴한다.(조건 연산자는 if와 같은 statement가 아닌 표현식임)

콤마 연산자(Comma OP)
콤마 연산자는 순차적인 계산을 제공하는 C++의 특별한 연산자이다.
콤마 연산자의 (‘,’) 왼쪽을 먼저 계산한 후, 오른쪽을 계산한다.
표현식 전체 값은 오른쪽 하위 표현식의 값임

콤마 연산자를 이용하면, 하나의 표현식만 사용할 수 잇는 프로그램 위치에서도 여러개의 표현식을 계산할 수 있다.
for(int i=0; i<n || j<n; i++, j++)
콤마 표현식을 함수의 인수로 사용할 때는 괄호로 둘러싸야 함
메모리 처리
new
delete

new와 delete는 C에서 calloc(), free()와 같이 동적 메모리 할당 및 해제하는 연산자이다.
접근 연산자
하위 구조 접근, 참조(변수의 주소를 가져옴), 간접 참조(주소를 통해 참조된 메모리에 접근)을 위한 연산
연산 표현식
멤버 선택 x.m
역참조된 멤버 선택 p->m
첨자 x[i]
역참조 *x
멤버 역참조 x.*q
역참조된 멤버 역참조 p->*q
타입 처리 연산자
런타임 타입 식별 typeid(x)
타입 식별 typeid(t)
오브젝트 크기 sizeof(x) |
sizeof x
타입의 크기 sizeof(t)
인수의 개수 sizeof…(p)
타입 인수의 개수 sizeof…(P)
맞춤(Alignment) alignof(x)
타입의 맞춤 alignof(t)
sizeof 연산자는 표현식에서 괄호 없이 사용할 수 있는 유일한 연산자이며,
alignof 연산자는 C++11에서 도입된 연산자이다.
오류 처리(Handling Error)
try, catch, throw
실행 시, 예외를 나타내는데 사용된다.(C에서 없던 새로운 내용)
오버로딩(Overloading)
새로운 타입에 대해 연산자들을 정의할 수 있다.(연산자 오버로딩)
(내장 타입들의 연산자는 변경할 수 없음, 하지만 새로운 타입과 어떻게 상호작용할지 정의할 수 있음)

오버로딩 할 수 없는 연산자
::        스코프(범위) 지정
.        멤버 선택(C++17에 추가될 예정, C++17 표준에서는 추가되지 않음)
.*        포인터를 통한 멤버 선택
?:        조건부
sizeof        타입이나 오브젝트의 크기
sizeof…        인수의 개수
alignof        타입이나 오브젝트의 메모리 맞춤
typeif        타입 식별자
연산자 우선순위
class::membernspace::member::name::qualified-name
object.member
*_cast<type>(expr)
type(expr list)
pointer->member
lvalue++
expr[expr]
lvalue--
expr(expr list)
typeid(type/expr)
sizeof expr
++lvalue
-expr
new … type …
sizof(type)
--lvalue
+expr
delete [] opt pointer
sizeof…(pack)
~expr
&lvalue
(type)expr
alignof(type/expr)
!expr
*expr
object.*member ptrpointer->*member ptr
expr * exprexpr / exprexpr % expr
expr  + exprexpr - expr
expr << exprexpr >> expr
expr < exprexpr <=exprexpr > exprexpr >= expr
expr == exprexpr != expr
expr & expr
expr ^ expr
expr | expr
expr && expr
expr || expr
expr ? expr : expr
lvalue = exprlvalue @=expr
throw expr
expr, expr