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;
}

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;
}

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;
}

5. 시프트 연산 >>, <<
비트 연산자인 오른쪽 시프트 >>와 왼쪽 시프트 <<은 (변수 >> 이동 비트 수) 혹은 (변수 << 이동 비트 수) 형태로 사용
>>은 오른쪽으로, <<은 왼쪽으로 지정 비트 수만큼 비트를 이동시키고, 모자라는 비트는 0으로 채운다.
4비트로만 수를 표현할 때 '0101'을 >>로 1비트 이동시키면, '0010'이 되며 오른쪽 비트 1은 사라진다.
그리고 왼쪽에 부족한 비트로 0이 채워진다

#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;
}

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

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;
}

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;
}

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

삼항연산자는 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;
}

'프로그래밍 > 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 |