C++ 이항 연산자와 삼항 연산자

1. 이항 연산자 표현식

 

(피연산자) (연산자) (피연산자)처럼 연산에 참여하는 피연산자가 2개인 표현식

 

대부분의 산술 연산자와 관계 연산자가 여기에 속함

 

 

1) 산술연산자(수치 계산)

 

대입: a = 10

 

더하기: a + b

 

빼기: a - b

 

곱하기: a * b

 

나누기: a / b

 

나머지: a % b

 

 

2) 관계 연산자 (true/ false로 관계 평가)

 

같음 : a == b

 

같지 않음: a != b

 

초과: a > b

 

이상: a >= b

 

미만: a < b

 

이하: a <= b

 

 

3) 논리 연산자

 

논리 AND(둘 다 true일때만 true) : a && b

 

논리 OR(둘 중 하나만 true여도 true이고 둘 다 false일때만 false) : a || b

 

 

4)비트 연산자

 

AND : a & b

 

OR : a | b

 

XOR: a ^ b

 

오른쪽 시프트: a >> b

 

왼쪽 시프트: a << b

 

 

2. 비트 AND

 

비트 AND는 첫번째 피연산자의 각 비트를 두번째 피연산자의 비트와 비교해서,

 

양쪽 비트가 모두 1일때만 결과 비트를 1로 설정한다.

 

그 외에는 해당 비트를 0으로 설정

 

a b a & b
0 0 0
0 1 0
1 0 0
1 1 1

 

 

bitset<8>(a)는 정수 a를 8비트 이진수로 표현해서 출력해줌

 

#include <iostream>
#include <bitset>

using namespace std;

int main(){

	int a = 13;
	int b = 27;
	int c = a & b; // 비트 AND 연산;

	cout << "a = " << bitset<8>(a) << " : " << a << endl;
	cout << "b = " << bitset<8>(b) << " : " << b << endl;
	cout << "c = " << bitset<8>(c) << " : " << c << endl;

	return 0;
}

 

 

etc-image-0

 

 

 

3. 비트 OR

 

비트 OR |은 첫번째 피연산자의 각 비트를 두번째 피연산자의 각 비트와 비교해, 양쪽 중 하나라도 1이 있다면 1로 설정

 

양쪽 비트 모두 0이면 해당 비트를 0으로 설정

 

a b a | b
0 0 0
0 1 1
1 0 1
1 1 1

 

 

#include <iostream>
#include <bitset>

using namespace std;

int main(){

	int a = 13;
	int b = 27;
	int c = a | b; // 비트 OR 연산;

	cout << "a = " << bitset<8>(a) << " : " << a << endl;
	cout << "b = " << bitset<8>(b) << " : " << b << endl;
	cout << "c = " << bitset<8>(c) << " : " << c << endl;

	return 0;
}

 

 

etc-image-1

 

 

 

4. 비트 XOR

 

비트 연산자 XOR ^은 첫번째 피연산자의 각 비트를 두번째 피연산자의 비트와 비교하는데

 

두 비트가 서로 다를때만 1로 설정된다.

 

두 비트가 서로 같으면 0으로 된다.

 

a b a ^ b
0 0 0
0 1 1
1 0 1
1 1 0

 

#include <iostream>
#include <bitset>

using namespace std;

int main(){

	int a = 13;
	int b = 27;
	int c = a ^ b; // 비트 XOR 연산;

	cout << "a = " << bitset<8>(a) << " : " << a << endl;
	cout << "b = " << bitset<8>(b) << " : " << b << endl;
	cout << "c = " << bitset<8>(c) << " : " << c << endl;

	return 0;
}

 

 

 

 

etc-image-2

 

 

 

5. 시프트 연산 >>, <<

 

비트 연산자인 오른쪽 시프트 >>와 왼쪽 시프트 <<은 (변수 >> 이동 비트 수) 혹은 (변수 << 이동 비트 수) 형태로 사용

 

>>은 오른쪽으로, <<은 왼쪽으로 지정 비트 수만큼 비트를 이동시키고, 모자라는 비트는 0으로 채운다.

 

4비트로만 수를 표현할 때 '0101'을 >>로 1비트 이동시키면, '0010'이 되며 오른쪽 비트 1은 사라진다.

 

그리고 왼쪽에 부족한 비트로 0이 채워진다

 

etc-image-3

 

 

 

#include <iostream>
#include <bitset>

using namespace std;

int main(){

	int a = 13;
	int b = a >> 1; //1bit 오른쪽으로
	int c = a << 1; //1bit 왼쪽으로

	int d = a >> -1; //시프트 수행 오류
	int e = a << 32; //시프트 수행 오류

	cout << "a = " << bitset<8>(a) << " : " << a << endl;
	cout << "b = " << bitset<8>(b) << " : " << b << endl;
	cout << "c = " << bitset<8>(c) << " : " << c << endl;
	cout << "d = " << bitset<8>(d) << " : " << d << endl;
	cout << "e = " << bitset<8>(e) << " : " << e << endl;

	return 0;
}

 

etc-image-4

 

 

이동할 비트 수가 음수이거나 너무 크면 시프트 연산이 제대로 수행되지 않는다.

 

d와 e가 제대로 수행되지 않은 결과이고

 

etc-image-5

 

 

 

6. 삼항연산자

 

피연산자가 3개인 표현식

 

(조건식) ? (참일때 표현식) : (거짓일때 표현식)

 

삼항 연산자는 if~else처럼 동작한다

 

#include <iostream>
#include <bitset>

using namespace std;

int main(){

	int a = 7;
	int b = 5;
	int result;

	if (a > b)
		result = a; //a > b가 true이면 result에 a값 저장
	else
	    result = b; //a > b가 false이면 result에 b값 저장

	cout << "result = " << result << endl;

	return 0;
}

 

 

 

etc-image-6

 

 

 

if문 대신 삼항 연산자로 바꾸면

 

#include <iostream>

using namespace std;

int main(){

	int a = 7;
	int b = 5;
	int result;

	result = a > b ? a : b; // a > b결과에 따라 result에 a값 또는 b값 저장

	cout << "result = " << result << endl;

	return 0;
}

 

 

etc-image-7

 

 

 

코드에서 조건식 a > b의 결과가 true이므로 result변수에는 a값이 저장

 

etc-image-8

 

 

 

삼항연산자는 if문보다 코드를 간략하게 작성할 수 있지만, 무분별하게 사용하면 가독성이 떨어질 수 있다

 

그리고 한줄 단위로 디버깅할 때 더 불편할수도 있다

 

따라서 삼항 연산자는 코드의 가독성을 해치지 않는 범위에서 적절하게 사용하는 것이 좋다

 

 

7. 연산자 우선순위

 

연산자를 여러개 사용할때, 또는 연산자 위치에 따라 연산 순서가 있다

 

우선순위 연산자 설명 결합법칙
1 :: 범위 지정 왼쪽에서 오른쪽으로
2 a++, a-- 변수 값을 먼저 반환 후, 증감
type(), type{} 형변환
a() 함수 호출
a[] 배열 요소 접근
. , -> 멤버 접근
3 ++a, --a 변수 값을 증감 후, 반환 오른쪽에서 왼쪽으로
+a, -a 양수 또는 음수로
!, ~ 논리 NOT, 비트 NOT
(type) C 스타일 형 변환
*a 포인터 변수 a가 가리키는 메모리에 있는 값
&a a의 주소
sizeof 피연산자의 크기
co_await 대기 표현식(C++20부터)
new, new[] 동적 메모리 할당
delete, delete[] 동적으로 할당한 메모리 해제
4 .*  ->* 멤버 포인터를 통한 멤버 접근 왼쪽에서 오른쪽으로
5 a*b, a/b, a%b 곱셈, 나눗셈, 나머지연산
6 a+b, a-b 덧셈,뺄셈
7 << , >> 비트 왼쪽, 오른쪽 시프트
8 <=> 세가지 비교 연산자를 포함한 비교
9 < <= > >= 비교연산자
10 == !=  비교연산자
11 a&b 비트 AND
12 ^ 비트 XOR
13 | 비트 OR
14 && 논리 AND
15 || 논리 OR
16 a ? b:c 삼항연산자 오른쪽에서 왼쪽으로
throw 예외 발생
co_yield 현재 코루틴을 일시 중단하고 값 반환(C++20부터)
= 대입 연산(C++클래스에서 기본 제공)
+=, -= 현재 변수에 값을 더하거나 빼서 저장
*=, /=, %= 현재 변수에 값을 곱하거나 나누거나 나머지를 구해 저장
<<= >>=  현재 변수의 비트를 왼쪽이나 오른쪽으로 시프트해서 저장
&=, ^= , |= 현재 변수와 다른 값을 AND, XOR, OR해서 저장
17 , 표현식 구분 왼쪽에서 오른쪽으로

 

 

당연히 다 외우기는 어렵기 때문에

 

() 괄호를 사용해서 우선순위를 정하는게 편하다

 

#include <iostream>

using namespace std;

int main(){

	int a = 5, b = 2, c = 8;

	int result_1 = a + b * c; // 곱셈 먼저 연산(오른쪽으로 결합)
	cout << "Result 1: " << result_1 << endl;

	int result_2 = (a + b) * c; //괄호로 우선순위 변경
	cout << "Result 2: " << result_2 << endl;

	a += b * c; //곱셈 먼저 연산
	cout << "Result 3: " << a << endl;

	bool condition = true;
	int result_4 = (condition && a > b) ? a : b; // > 먼저 연산(왼쪽으로 결합)
	cout << "Result 4: " << result_4 << endl;

	return 0;
}

 

 

 

etc-image-9

 

728x90

'프로그래밍 > C++' 카테고리의 다른 글

C++의 연산자와 표현식  (0) 2025.03.01
키워드와 리터럴  (0) 2025.02.15
C++의 변수 형식 변환  (0) 2025.02.12
L-value와 R-value??  (0) 2025.02.12
C++ 변수 유효 범위  (0) 2025.01.23