/ 연산자와 % 연산자의 차이
/는 몫을 나타내고 %는 나머지를 나타낸다.
// --- / ---
int a = 5;
int b = 2;
printf("%d 나누기 %d = %d", a, b, a/b);
//--출력--
// 5 나누기 2 = 2
위 처럼 정수끼리 나눠주면 정수 값만 출력한다. 따라서 실수 값으로 출력하고 싶다면 실수끼리 나눠줘야한다.
// --- / ---
double a = 5.0;
double b = 2.0;
printf("%.1lf 나누기 %.1lf = %.1lf", a, b, a/b);
//--출력--
// 5.0 나누기 2.0 = 2.5
증감 연산자
int a,b = 10;
++a; // 해당 코드는 a = a + 1; 과 같다. 따라서 11
--b; // 해당 코드는 b = b + 1; 과 같다. 따라서 11
전위 표기와 후위 표기의 차이
전위 표기란 ++a, —b 와 같이 변수 앞에 증감 연산자를 사용하는 경우이고, 후위 표기는 a++, b—와 같이 변수 뒤에 증감 연산자를 사용하는 경우이다.
단독으로 쓸 때는 값의 변화가 없지만 다른 연산자랑 사용할 때는 변화가 있다.
int a, b =5;
int pre, post;
pre = (++a) * 3; // 전위 표기는 증가된 값이 곱해지기에 먼저 증가 '6', 그 후 곱셈 '18'
post = (b++) * 3; // 후위 표기는 증가되기 전 값이 곱해지기에 '5', 그 후 곱셈 '15' 그 후 b 값이 증가된다.
printf("증감 연산후 초기값 a = %d, b = %d\\n", a, b);
printf("전위 표기 pre: %d, 후위 표기 post: %d", pre, post);
쉽게 이야기하자면
- 전위 표기
- 전위 표기 된 변수 값 증가 | a [ 6 ]
- 곱셈 | pre [ 18 ]
- 후위 표기
- 후위 표기 된 변수 값 유지 ****| b [ 5 ]
- 유지된 값이랑 곱셈 ****| post [ 15 ]
- 후위 표기 된 변수 값 증가 | b [ 6 ]
비트 연산자
비트 연산자에는 논리 연산자 이동 연산자가 있다.
- 논리
- &
- |
- ^
- ~
- 이동
- <<
& (논리곱) 연산자
int a = 10;
int b = 5;
printf("a & b: %d", a & b); // 0
거짓거짓거짓거짓
00000000 00000000 00000000 00001010
&) 00000000 00000000 00000000 00000101
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
00000000 00000000 00000000 00000000
| (논리합) 연산자
int a = 10;
int b = 5;
printf("a | b: %d", a | b); // 15
참참참참
00000000 00000000 00000000 00001010
|) 00000000 00000000 00000000 00000101
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
00000000 00000000 00000000 00001111
^(배타적 논리합) 연산자
: 두 피연산자의 참, 거짓 값이 서로 다를 때만 참이다.
int a = 10;
int b = 5;
printf("a ^ b: %d", a ^ b); // 15
참참참참
00000000 00000000 00000000 00001010
^) 00000000 00000000 00000000 00000101
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
00000000 00000000 00000000 00001111
~(부정) 연산자
: 피연산자의 비트를 반전 시킨다.
int a = 10;
printf("~a: %d", ~a); // -11
~) 00000000 00000000 00000000 00001010
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
11111111 11111111 11111111 11110101
<< >> (이동)연산자
: <<는 왼쪽으로 이동, >>는 오른쪽으로 이동
int a = 10;
printf("a << 1: %d", a << 1); //20
<<) 00000000 00000000 00000000 00001010
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
00000000 00000000 00000000 00010100
printf("a >> 1: %d", a >> 1); //5
>>) 00000000 00000000 00000000 00001010
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
00000000 00000000 00000000 00000101
❓비트들이 이동했을 때 비워진 칸들은 어떻게 되나?
→ 0으로 모두 채워진다. 단, 만약 해당 값이 음수 였다면 1을 넣어 음수를 유지해 주어야한다.
'문법관련 > C' 카테고리의 다른 글
8. 함수 (0) | 2024.06.14 |
---|---|
7. 반복문 - do while (0) | 2024.06.13 |
5. scanf 함수 (1) | 2024.06.10 |
4-2. 자료형 마다 저장할 수 최대값과 최솟값 (0) | 2024.06.03 |
4. 변수 선언 및 초기화 (0) | 2024.06.03 |