모든 연산의 과정은 연산자의 우선순위에 따라 결정된다.
연산자 우선순위는 다음과 같다.
| 연산자 설명 | 연산자 | 대체 |
|---|---|---|
| 그룹 1 우선 순위, 연관성 없음 | ||
| 범위 확인 | :: |
|
| 그룹 2 우선 순위(왼쪽에서 오른쪽 연결성) | ||
| 멤버 선택(개체 또는 포인터) | . 또는 -> |
|
| 배열 첨자 | [] |
|
| 함수 호출 | () |
|
| 후위 증가 | ++ |
|
| 후위 감소 | -- |
|
| 형식 이름 | typeid |
|
| 상수 형식 변환 | const_cast |
|
| 동적 형식 변환 | dynamic_cast |
|
| 재해석 형식 변환 | reinterpret_cast |
|
| 정적 형식 변환 | static_cast |
|
| 그룹 3 우선 순위( 오른쪽에서 왼쪽 연결성) | ||
| 개체 또는 형식의 크기 | sizeof |
|
| 전위 증가 | ++ |
|
| 전위 감소 | -- |
|
| 하나의 보완 | ~ |
compl |
| 논리하지 않음 | ! |
not |
| 단항 부정 | - |
|
| 단항 더하기 | + |
|
| Address-of | & |
|
| 간접 참조 | * |
|
| 개체 만들기 | new |
|
| 개체 삭제 | delete |
|
| 캐스트 | () |
|
| 그룹 4 우선 순위(왼쪽에서 오른쪽 연결성) | ||
| 멤버 포인터(개체 또는 포인터) | .* 또는 ->* |
|
| 그룹 5 우선 순위(왼쪽에서 오른쪽 연결성) | ||
| 곱하기 | * |
|
| 사업부 | / |
|
| 모듈러스 | % |
|
| 그룹 6 우선 순위(왼쪽에서 오른쪽 연결성) | ||
| 더하기 | + |
|
| 빼기 | - |
|
| 그룹 7 우선 순위(왼쪽에서 오른쪽 연결성) | ||
| 왼쪽 시프트 | << |
|
| 오른쪽 시프트 | >> |
|
| 그룹 8 우선 순위(왼쪽에서 오른쪽 연결성) | ||
| 보다 작음 | < |
|
| 보다 큼 | > |
|
| 작거나 같음 | <= |
|
| 크거나 같음 | >= |
|
| 그룹 9 우선 순위(왼쪽에서 오른쪽 연결성) | ||
| 등호 | == |
|
| 같지 않음 | != |
not_eq |
| 그룹 10 우선 순위 왼쪽에서 오른쪽 연결성 | ||
| 비트 AND | & |
bitand |
| 그룹 11 우선 순위(왼쪽에서 오른쪽 연결성) | ||
| 배타적 비트 OR | ^ |
xor |
| 그룹 12 우선 순위(왼쪽에서 오른쪽 연결성) | ||
| 포괄적 비트 OR | | |
bitor |
| 그룹 13 우선 순위(왼쪽에서 오른쪽 연결성) | ||
| 논리적 AND | && |
and |
| 그룹 14 우선 순위(왼쪽에서 오른쪽 연결성) | ||
| 논리적 OR | || |
or |
| 그룹 15 우선 순위( 오른쪽에서 왼쪽 연결성) | ||
| 조건부 | ? : |
|
| 양도 | = |
|
| 곱하기 할당 | *= |
|
| 나누기 할당 | /= |
|
| 모듈러스 대입 | %= |
|
| 더하기 할당 | += |
|
| 빼기 할당 | -= |
|
| 왼쪽 시프트 할당 | <<= |
|
| 오른쪽 시프트 할당 | >>= |
|
| 비트 AND 대입 | &= |
and_eq |
| 포괄적 비트 OR 대입 | |= |
or_eq |
| 배타적 비트 OR 대입 | ^= |
xor_eq |
| throw 식 | throw |
|
| 그룹 16 우선 순위(왼쪽에서 오른쪽 연결성) | ||
| 쉼표 | , |
증감연산자를 사용할때는 전위와 후위에 따라 값의 할당이 달라지니 주의해서 사용해야한다.
다음 예제를 보고 값을 예측해보자
int main() {
int data = 10;
print("%d", data++);
return 0;
};
위 예제에서는 data에 증감연산자를 사용해서 출력을 하였다. 과연 이 값은 10일까? 11일까?
일반적인 상식으로는 data에 증감연산자를 사용하여 결과를 출력하는 것이니 11로 예측할 것이다. 그러나 컴퓨터는 위에서 아래로 우선순위를 고려하여 왼쪽에서 오른쪽으로 코드를 읽는다.
후위에 붙은 증감연산자는 값이 먼저 할당된 다음 증감연산자를 식별하여 값을 증감시킨다. 따라서 data는 10이 먼저 할당되어 있기때문에 출력 메소드의 매개변수로 10이 먼저 할당되어 출력하게 된다. 이후 증감연산자에 의해 data는 증감연산되어 11을 가지게 된다.
실제로 후위연산을 하고 다음 줄에 data를 출력하면 10에서 1 증가된 11을 출력한다.
int main() {
int data = 10;
print("%d", data++); //10을 출력
print("%d", data); // 11을 출력
return 0;
};
증감연산자를 사용할때는 되도록 전위를 사용하여 혼돈을 방지하고 만약 후위를 사용해야 한다면 의도를 명확하게 하여 사용해야 겠다.
위와 동일한 코드에 증감식을 전위로 변경하면 결과는 다음과 같다.
int main() {
int data = 10;
print("%d", ++data); //11을 출력
print("%d", data); // 11을 출력
return 0;
};
!(역)연산자는 값을 true는 false로 false는 true로 변환한다. 기본적으로 c++언어에서는 false는 0 true는 0이아닌 값으로 단순히 false와 true를 출력하면 true는 1 false는 0을 출력하게 된다.
만약 문자 그대로 false와 true를 출력하고 싶다면
문자 그대로 false와 true를 출력하고 싶다면 삼항연산자나 if문을 이용하여 false일 때 문자열 false, true일때 문자열 true를 출력하도록 해도 되지만 boolalplha를 이용하면 좀더 쉽게 문자 그대로 bool타입을 출력할 수 있다.#include <iostream> using namespace std; int main(){ bool b = true; // boolalpha를 이용한 변수 b 출력 //true cout << boolalpha << b << endl; b = false; //false cout << boolalpha << b << endl; return 0; }
bool타입에 0이 아닌 값을 넣으면 1이 출력된다.
bool IsTrue = 100; // 1
IsTrue를 역 연산자를 이용하여 0을 출력할 수 있다.
IsTrue = !IsTrue; // 0
int형도 마찬가지로 0이 아닌 값을 역 연산자를 이용하여 값을 할당하면 0을 출력한다.
int IsTrue = 100; // 100
IsTrue = !IsTrue; // 0
0인 값을 역연산자를 적용하면 1이 출력된다.
&&곱연산자는 모두가 참일 때 참을 출력하고 참이 아닌 조건식이 있다면 거짓이 출력된다.
곱연산자라는 이름과 같이
0이 하나라도 포함되면 0(거짓)이 되고
모두가 참이면 참을 반환한다.
0은 false, 0이 아닌 값은 true이기에 다음과 같이 연산 결과를 예측해 볼 수 있다.
int iTrue = 0;
iTrue = 100 && 200; // 1
iTrue = 0 && 200; // 0
||합연산자는 조건식 중 하나의 조건식이 참이면 참을 반환하고 모두가 거짓일 때 거짓을 반환한다.
두 조건식 중 하나의 조건식이 0이 아니라면 결과는 0이 아닌 값이 되므로 true가 출력되고
조건식 모두 거짓일 때 false를 출력하게 된다.
iTrue = 0 || 200; // 1
iTrue = 0 || 0; // 0