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++;
(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 && 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의 타입이 일치하지 않을 경우, 가능하다면, expr의 타입을 object의 타입으로 변환 후,
object에 할당한다.
할당 연산자는 오른쪽에서 왼쪽으로 할당하기 때문에 아래와 같이 표현할 수 있다.
할당 연산자는 모든 산술 연사자 또는 비트 연사자 보다 낮은 우선순위를 가지기 때문에 오른쪽에 있는 표현식은
항상 할당을 수행하기 전에 처리된다
Program FlowC++에서 프로그램의 흐름을 제어하는 연산자는 세 가지(함수, 조건 연산자, 콤마 연산자)이다
함수
조건 연산자: 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::member | nspace::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 ptr | pointer->*member ptr | | |
expr * expr | expr / expr | expr % expr | |
expr
+ expr | expr - expr | | |
expr << expr | expr >> expr | | |
expr < expr | expr <=expr | expr > expr | expr >= expr |
expr == expr | expr != expr | | |
expr & expr | | | |
expr ^ expr | | | |
expr | expr | | | |
expr && expr | | | |
expr || expr | | | |
expr ? expr : expr | | | |
lvalue = expr | lvalue @=expr | | |
throw expr | | | |
expr, expr | | | |