C++ - 연산자

이강민·2023년 8월 18일

C++

목록 보기
3/22
post-thumbnail

연산자

연산자 우선순위

모든 연산의 과정은 연산자의 우선순위에 따라 결정된다.
연산자 우선순위는 다음과 같다.

연산자 설명 연산자 대체
그룹 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 우선 순위(왼쪽에서 오른쪽 연결성)
쉼표 ,
<출처 : https://learn.microsoft.com/ko-kr/cpp/cpp/cpp-built-in-operators-precedence-and-associativity?view=msvc-170, 마이크로소프트>

증감연산자

증감연산자를 사용할때는 전위와 후위에 따라 값의 할당이 달라지니 주의해서 사용해야한다.
다음 예제를 보고 값을 예측해보자

  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이 출력된다.

곱연산자

&&곱연산자는 모두가 참일 때 참을 출력하고 참이 아닌 조건식이 있다면 거짓이 출력된다.
곱연산자라는 이름과 같이
10=01 * 0 = 0
01=00 * 1 = 0
00=00 * 0 = 0
0이 하나라도 포함되면 0(거짓)이 되고
11=11 * 1 = 1
모두가 참이면 참을 반환한다.

0은 false, 0이 아닌 값은 true이기에 다음과 같이 연산 결과를 예측해 볼 수 있다.

	int iTrue = 0;
	iTrue = 100 && 200; // 1
	iTrue = 0 && 200; // 0

합연산자

||합연산자는 조건식 중 하나의 조건식이 참이면 참을 반환하고 모두가 거짓일 때 거짓을 반환한다.
1+0=11 + 0 = 1
0+1=10 + 1 = 1
1+1=21 + 1 = 2
두 조건식 중 하나의 조건식이 0이 아니라면 결과는 0이 아닌 값이 되므로 true가 출력되고
0+0=00 + 0 = 0
조건식 모두 거짓일 때 false를 출력하게 된다.

	iTrue = 0 || 200; // 1
	iTrue = 0 || 0; // 0
profile
AllTimeDevelop

0개의 댓글