일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 플로이드 워셜 알고리즘(Floyd-Warshall Algorithm)
- BFS(Breadth First Search)
- 위상 정렬(Topology Sort)
- 백준 10000번
- DFS(Depth First Search)
- 백준 1707번
- 그래프(Graph)
- 스택(Stack)
- 백준 21606번
- 이분 그래프(Bipartite Graph)
- 그리디 알고리즘(Greedy Algorithm)
- 백준 18352번
- 백준 1948번
- DFS & BFS
- 분할 정복(Divide and Conquer)
- 백준 17608번
- 큐(Queue)
- BFS
- 동적 프로그래밍(Dynamic Programming)
- 알고리즘 개념
- 트리(Tree)
- 백준 2493번
- 다익스트라 알고리즘(Dijkstra Algorithm)
- DFS
- 백준 2812번
- 백준 9012번
- 이분 탐색(Binary Search)
- 위상 정렬(Topological Sort)
- 백준 2261번
- 백준 2504번
- Today
- Total
Always Be Wise
여러가지 연산자 본문
▶ 기본 연산자
덧셈, 뺄셈, 곱셈, 나눗셈 그리고 나머지 등의 연산자 등이 포함된다.
int main()
{
printf("%d", 2 + 6); // 8
printf("%d", 6 - 2); // 4
printf("%d", 2 * 6); // 12
printf("%d", 6 / 2); // 3
printf("%d", 7 % 2); // 1
return 0;
}
▶ 증감 연산자
증감 연산자는 변수에 담겨 있는 값을 증가하거나 감소시키는 연산자를 의미한다.
전위와 후위로 나뉘며 전위의 경우에는 먼저 값을 변화시킨 뒤에 연산자가 쓰인 줄의 코드를 실행시키고,
후위의 경우에는 연산자가 쓰인 줄의 코드를 실행한 후 값을 변화시킨다.
#include <stdio.h>
int main()
{
int i = 0;
printf("%d", ++i); // 1
i = 0; // 0 으로 초기화
printf("%d", i++); // 0
printf("%d", i); // 1
return 0;
}
▶ 관계 연산자
#include <stdio.h>
int main()
{
int number = 5;
printf("number 는 5와 같습니까? %d\n", number == 5); // 같으므로 1(참)
printf("number 는 4와 같습니까? %d\n", number == 4); // 같지 않으므로 0(거짓)
printf("number 는 5와 다릅니까? %d\n", number != 5); // 같으므로 0(거짓)
printf("number 는 4와 다릅니까? %d\n", number != 4); // 같지 않으므로 1(참)
printf("number 가 4보다 큽니까? %d\n", 4 < number); // 크므로 1(참)
printf("number 가 5보다 큽니까? %d\n", 5 < number); // 크지 않으므로 0(거짓)
printf("number 가 10보다 큽니까? %d\n", 10 < number); // 크지 않으므로 0(거짓)
printf("number 가 10보다 작습니까? %d\n", number < 10); // 작으므로 1(참)
printf("number 가 5보다 작습니까? %d\n", number < 5); // 작지 않으므로 0(거짓)
printf("number 가 4보다 작습니까? %d\n", number < 4); // 작지 않으므로 0(거짓)
printf("number 가 5보다 크거나 같습니까? %d\n", 5 <= number); // 크거나 같으므로 1(참)
printf("number 가 5보다 작거나 같습니까? %d\n", number <= 5); // 작거나 같으므로 1(참)
return 0;
}
▶ 논리 연산자
#include <stdio.h>
int main()
{
int number = 5;
printf("AND(논리곱) : number 는 3보다 크다. 그리고 10 보다 작다. : %d\n", 3 < number && number < 10); // 둘 다 참이므로 참(1)을 출력
printf("AND(논리곱) : number 는 3보다 크다. 그리고 10 보다 크다. : %d\n", 3 < number && 10 < number); // 둘 중 하나만 참이므로 거짓(0)을 출력
printf("OR(논리합) : number 는 5 이거나 4이다. : %d\n", number == 5 || number == 4); // 둘 중 하나라도 참이므로 참(1)을 출력
printf("OR(논리합) : number 는 6 이거나 7이다. : %d\n", number == 6 || number == 7); // 둘 다 거짓이므로 거짓(0)을 출력
return 0;
}
▶ 복합 대입 연산자
#include <stdio.h>
int main()
{
int a = 5; // 5 로 초기화하여 시작
a += 5;
printf("%d\n", a); // 10 출력
a -= 3;
printf("%d\n", a); // 7 출력
a *= 5;
printf("%d\n", a); // 35 출력
a /= 7;
printf("%d\n", a); // 5 출력
a %= 4;
printf("%d\n", a); // 나머지 1 출력
return 0;
}
▶ 비트 연산자 / 비트 이동 연산자
비트 연산은 정수나 정수로 변환 가능한 타입만 가능하며, 실수나 포인터 등은 비트 연산을 할 수 없다.
비트는 컴퓨터에서 사용할 수 있는 최소 단위로 0과 1로 표현된다.
&(AND) 연산자
& 연산자는 논리 연산자의 &&와 헷갈릴 수 있는데, 논리 연산은 true와 false를 반환하고 비트 연산은 값을 반환하는 차이가 있다.
또한, & 연산자는 주소 값을 가리킬 때도 사용하지만, 주소 값을 가리키는 & 연산자는 단항 연산자로 피연산자가 한 개만 필요하다.
즉, & 연산자가 10 & 6과 같이 쓰일 때 비트의 AND 연산을 나타내며, 두 개의 비트가 모두 1일 때 1을 반환한다.
|(OR) 연산자
| 연산자는 OR 연산으로 두 개의 비트 중 하나라도 1이면 1을 반환한다.
또한, & 연산자는 주소 값을 가리킬 때도 사용하지만, 주소 값을 가리키는 & 연산자는 단항 연산자로 피연산자가 한 개만 필요하다.
즉, & 연산자가 10 & 6과 같이 쓰일 때 비트의 AND 연산을 나타내며, 두 개의 비트가 모두 1일 때 1을 반환한다.
^(XOR) 연산자
^ 연산자는 XOR 연산으로 두 개의 비트가 다르면 1을, 같으면 0을 반환한다.
~(NOT) 연산자
~ 연산자는 NOT 연산으로 AND, OR, XOR과 다르게 피연산자가 하나이며 한 값의 비트를 모두 반전시킨다.
<<(왼쪽 shift) 연산자
<< 연산자는 지정한 횟수대로 비트의 자리를 왼쪽으로 이동시키는 연산자이다. 예를 들어, 4 << 1의 경우 0000 0100(4)에서
0000 1000(8)이 된다. 이렇게 비트가 한 자리씩 왼쪽으로 이동할 때마다 해당 정수의 값은 두배가 된다.
>>(오른쪽 shift) 연산자
>> 연산자는 지정한 횟수대로 비트의 자리를 오른쪽으로 이동시키는 연산자이다. 예를 들어, 4 >> 1의 경우 0000 0100(4)에서
0000 0010(2)이 된다. 이렇게 비트가 한 자리씩 오른쪽으로 이동할 때마다 해당 정수의 값은 반이 된다.
비트 연산자는 singend와 unsigned인지에 따라, 그리고 자료형의 종류에 따라 추가적인 보수 연산이 필요한 경우가 있다.
#include <stdio.h>
int main()
{
unsigned char a = 5; // 0000 0101
unsigned char b = 10; // 0000 1010
unsigned char c;
c = a & b;
printf("%d\n", c);
c = a | b;
printf("%d\n", c);
c = a ^ b;
printf("%d\n", c);
c = ~a;
printf("%d\n", c);
c = a << 2;
printf("%d\n", c);
c = a >> 2;
printf("%d\n", c);
return 0;
}