논리 연산자
논리 연산자는 주어진 논리식에 대해서 참(true), 거짓(false)을 판별해 주는 연산자이다.
ex) 로그인을 할 때 아이디도 같고, 비밀번호도 같아야 한다. (AND)
ex) 비밀번호에 대문자를 넣거나, 특수문자를 넣어야 한다. (OR)
&& | 두 항을 비교하여 두 항이 모두 참인 경우 1을 반환한다. 그 외는 0 (AND) |
|| | 두 항을 비교하여 두 항중에 하나라도 참인 경우 1를 반환한다. 그 외는 0 (OR) |
! | 항의 결과가 참이면 0을 거짓이면 1을 반환한다. (NOT) |
int main()
{
int a = 12;
int b = 7;
int test1 = !(a > b);
int test2 = (a > 10) && (b > 10);
int test3 = (a > 10) || (b > 10);
cout << "test1 = " << test1 << endl;
cout << "test2 = " << test2 << endl;
cout << "test3 = " << test3 << endl;
return 0;
}
/*실행결과
test1 = 0
test2 = 0
test3 = 1
*/
--------------------------------------------------------------------------------------------------------------------------------
산술 연산자
산술 연산자는 사칙연산을 처리하기 위해 자주 쓰이는 연산자이다.
산술 연산자는 항이 2개가 필요한 이항 연산자 이며 왼쪽 항을 기준으로 실행된다. (기준 쪽을 '피연산자'라고 부르기도 함)
+ | 왼쪽 항에 오른쪽 항의 값을 더한다. |
- | 왼쪽 항에 오른쪽 항의 값을 뺀다. |
* | 왼쪽 항에 오른쪽 항의 값을 곱한다. |
/ | 왼쪽 항을 오른쪽 항의 값으로 나눈다. |
% | 왼쪽 항을 오른쪽 항의 값으로 나눈 나머지 |
int main()
{
int a = 12;
int b = 7;
int add = a + b;
int sub = a - b;
int mul = a * b;
int div = a / b;
int rem = a % b;
cout << "add = " << add << endl;
cout << "sub = " << sub << endl;
cout << "mul = " << mul << endl;
cout << "div = " << div << endl;
cout << "rem = " << rem << endl;
return 0;
}
/*실행결과
add = 19
sub = 5
mul = 84
div = 1
rem = 5
*/
위의 경우 div의 값이 1이 나오는데, 이것은 자료형이 정수형이기 때문에 출력되는 값 또한 정수형이기 때문이다.
--------------------------------------------------------------------------------------------------------------------------------
대입 연산자
대입 연산자의 경우 변수에 값을 대입할 때 사용하는 연산자다. 그냥 산술 연산자를 줄인 버전이라 봐도 된다.
= | 왼쪽항에 오른쪽항을 대입한다. (a는 b랑 같다 라는 뜻이 아님) |
+= | 왼쪽항에 오른쪽항을 더한 후 그 값을 왼쪽항에 대입한다. |
-= | 왼쪽항에 오른쪽항을 뺀 후 그 값을 왼쪽항에 대입한다. |
*= | 왼쪽항에 오른쪽항을 곱한 후 그 값을 왼쪽항에 대입한다. |
/= | 왼쪽항에 오른쪽항을 나눈 후 그 값을 왼쪽항에 대입한다. |
%= | 왼쪽항에 오른쪽항을 나눈 후 그 값의 나머지를 왼쪽항에 대입한다. |
즉 a += b는 a = a + b와 같은 동작이라고 이해하면 된다. *=, -=등도 동일하다.
=+로 바꾸어서 사용할 경우 값에 아무런 변화가 없는 것을 확인할 수 있다. 따라서 연산자의 순서를 주의해야 한다.
--------------------------------------------------------------------------------------------------------------------------------
증감 연산자
증감 연산자는 변수를 1씩 증가 또는 감소 시킬때 사용한다. 전치 연산과 후치 연산의 차이점을 주의해야한다.
++a | 먼저 피연산자의 값을 1 증가시킨 후에 해당 연산을 진행한다. |
a++ | 먼저 해당 연산을 진행한 후에 피연산자의 값을 1 증가시킨다. |
--a | 먼저 피연산자의 값을 1 감소시킨 후에 해당 연산을 진행한다. |
a-- | 먼저 해당 연산을 진행한 후에 피연산자의 값을 1 감소시킨다. |
전치와 후치의 차이점은 연산의 순서이다. 전치 연산자 즉 ++ 또는 --가 앞에 붙을 경우에는 먼저 1을 증가, 감소시킨 뒤 해상 변수를 참조하여 연산을 진행하고, ++ 또는 --가 뒤에 붙을 경우에는 변수가 진행하는 연산을 먼저 실행한 후 변수의 값을 1 증가, 감소시킨다.
int main()
{
int a = 5;
int b = 5;
int test1 = ++a - 5;
int test2 = a++ - 5;
cout << "test1 = " << test1 << endl;
cout << "test2 = " << test2 << endl;
return 0;
}
/*실행 결과
test1 = 1 / a = 6
test2 = 0 / a = 6
*/
위 코드를 보면 test1은 a가 전치연산 이므로 1 증가가 먼저 되어서 test1의 결과가 1이고,
test2는 a가 후치연산 이므로 계산이 모두 이뤄진 후 1이 증가가 되어서 test2의 결과는 2이다.
--------------------------------------------------------------------------------------------------------------------------------
비교 연산자
비교 연산자의 경우 두 항 사이의 상대적인 크기를 비교하는 연산자이다.
이항 연산자이며 왼쪽에서 오른쪽으로 결합된다.
== | 두 항의 값이 같으면 1을 반환한다. |
!= | 두 항의 값이 다르면 1을 반환한다. |
> | 왼쪽항이 오른쪽항 보다 크면 1을 반환한다. |
>= | 왼쪽항이 오른쪽항 보다 크거나 같으면 1을 반환한다. |
< | 왼쪽항이 오른쪽항 보다 작으면 1을 반환한다. |
<= | 왼쪽항이 오른쪽항 보다 작거나 같으면 1을 반환한다. |
일반 수학에서는 서로 같다는 의미로 = 을 사용하는데, =이 대입 연산자로 사용되고 있으므로 서로 같다는 ==을 사용함.
비교 연산은 for문에서 거의 항상 사용됨.
--------------------------------------------------------------------------------------------------------------------------------
비트 연산자
비트 연산자는 비트 단위로 논리 연산과 조작을 필요할 때 사용한다.
ex) Bit flags (비트 플래그), 플레이어 버프 / 디버프 여부 확인? 등등
& | 두 항의 비트를 비교 / 같은 자리의 비트가 모두 1일 경우 1을 반환 (비트 AND) |
| | 두 항의 비트를 비교 / 같은 자리의 비트중 1이 있다면 1을 반환 (비트 OR) |
^ | 두 항의 같은 자리의 비트가 서로 다를 경우 1을 반환 (비트 XOR) |
~ | 비트가 1일 경우 0으로, 0일 경우 1로 반 (비트 NOT) |
<< | 지정한 수만큼 비트를 왼쪽으로 이동 (Left Shift) |
>> | 지정한 수만큼 비트를 오른쪽으로 이동 (Right Shift) |
int main()
{
char a = 3;
char b = 21;
// a : 0000 0011
// b : 0001 0101
int c = a & b;
// c : 0000 0001 = 1
int c = a | b;
// c : 0001 0111 = 23
int c = a ^ b;
// c : 0001 0110 = 22
int c = ~b;
// c : 1110 1010 = 234
int c = a << 1;
// c : 0000 0110 = 6
int c = b >> 1;
// c : 0000 1010 = 10
return 0;
}
a ^ a 즉 자기 자신을 ^(XOR)하면 0이 된다.
ex) -12 = 1111 0100 이를 >> 연산하면 - 부호가 있기 때문에 부호 비트 1은 유지하고 나머지 비트열만 오른쪽으로 이동한다. -70 = 1011 1010
(시프트 연산을 한다면 unsigned로 정의해 줘야 부호비트에 상관없이 가능하다)
ex) 비트 연산 활용
#define HUNGRY 0x0001
#define THIRSTY 0x0002
#define TIRED 0x0004
#define TIRED2 0x0008
#define TIRED3 0x0010
#define TIRED4 0x0020
#define TIRED5 0x0040
#define TIRED6 0x0080
#define TIRED7 0x0100
#define TIRED8 0x0200
#define TIRED9 0x0400
#define TIRED0 0x0800
// 16진수로 하면 이렇게 반복적인 패턴이 나옴
int main()
{
unsigned int status = 0;
status |= HUNGRY; // 배고픔 상태 추가
status |= THIRSTY; // 목마름 상태 추가
if (status & HUNGRY) // 만약 배고픔 상태라면~
{
}
// 특정 자리 비트 제거
status &= ~HUNGRY;
// 플레이어 : 1010 0000 / 배고픔 없는상태
// 배고픔 : 1111 1110 / 배고픔 반전상태
// 이 상태에서 &를 하면 플레이어가 배고픈 상태이던, 안배고픈 상태이건 다른 비트를 건들지 않고 배고픔 상태를 없앨 수 있음
return 0;
}
--------------------------------------------------------------------------------------------------------------------------------
삼향 연산자
삼향 연산자는 유일하게 3개의 피연산자를 가진다.
(조건식) ? 변수 1 : 변수 2의 형태로 사용할 수 있다.
변수 1, 2에 대하여 조건식을 판별하여 참이라면 변수 1을, 거짓이라면 변수 2를 반환한다.
int main()
{
int a = 10;
int b = 5;
int temp = (a < b) ? a : b;
cout << "temp = " << temp << endl;
return 0;
}
/*실행 결과
temp = 5
*/
조건식 a < b에 대하여 10이 5보다 크므로 거짓이 나온다. 따라서 변수 2인 b(5)가 temp에 대입된다.
'📕Programming > 📝C/C++' 카테고리의 다른 글
[C / C++] 배열 (array) (0) | 2023.09.11 |
---|---|
[C / C++] 반복문 (0) | 2023.09.10 |
[C / C++] 조건문 (0) | 2023.09.10 |
[C / C++] 문자 입출력 (0) | 2023.09.09 |
[C / C++] 자료형 (0) | 2023.09.05 |