C - 연산자: 프로그래밍 마법의 문
안녕하세요, 미래의 코딩 마법사들! ? 저는 여러분이 C 프로그래밍의 세계로 향하는 이 흥미로운 여정을 안내해 드리게 되어 기쁩니다. 오늘, 우리는 C에서의 연산자의 마법적인 영역을 탐험해 볼 것입니다. 아직 코드를 한 줄도 작성해본 적이 없다고 해도 걱정하지 마세요 – 저희는 매우 시작부터 함께 점진적으로 학습할 것입니다.
산술 연산자: 기본 마법
저희 프로그래밍 마법서에서 가장 간단한 마법으로 시작해 보겠습니다. 산술 연산자입니다. 이 연산자들은 C에서 대부분의 계산의 빌딩 블록입니다.
산술의 환상의 다섯 가지
여기 5가지 기본 산술 연산자가 있습니다:
연산자 | 이름 | 예시 |
---|---|---|
+ | 덧셈 | 5 + 3 = 8 |
- | 뺄셈 | 7 - 2 = 5 |
* | 곱셈 | 4 * 6 = 24 |
/ | 나눗셈 | 10 / 2 = 5 |
% | 나머지 (모듈러) | 7 % 3 = 1 |
이제 이를 실행해 보겠습니다:
#include <stdio.h>
int main() {
int a = 10, b = 3;
printf("덧셈: %d\n", a + b);
printf("뺄셈: %d\n", a - b);
printf("곱셈: %d\n", a * b);
printf("나눗셈: %d\n", a / b);
printf("나머지: %d\n", a % b);
return 0;
}
이 코드를 실행하면 다음과 같은 결과를 볼 수 있습니다:
덧셈: 13
뺄셈: 7
곱셈: 30
나눗셈: 3
나머지: 1
나눗셈이 3.33 대신 3을 주는 이유는 무엇인가요? C에서 정수를 나누면 정수 결과를 얻기 때문입니다. 모듈러 연산자(%)는 나눗셈 후 남는 나머지를 줍니다.
관계 연산자: 사과와 오렌지를 비교하는 것
이제 기본적인 수학을 할 수 있으므로, 물건들을 비교하는 방법을 배워 보겠습니다. 관계 연산자는 재능 경연에서의 심사위원과 같습니다 – 두 가지 값을 비교하여 서로의 관계를 알려줍니다.
여기 관계 연산자들입니다:
연산자 | 의미 | 예시 |
---|---|---|
== | 같다 | 5 == 5는 참 |
!= | 다르다 | 5 != 3는 참 |
> | 더 크다 | 7 > 3는 참 |
< | 더 작다 | 2 < 8는 참 |
>= | 더 크거나 같다 | 5 >= 5는 참 |
<= | 더 작거나 같다 | 4 <= 4는 참 |
이제 이를 사용해 보겠습니다:
#include <stdio.h>
int main() {
int x = 5, y = 8;
printf("x == y: %d\n", x == y);
printf("x != y: %d\n", x != y);
printf("x > y: %d\n", x > y);
printf("x < y: %d\n", x < y);
printf("x >= y: %d\n", x >= y);
printf("x <= y: %d\n", x <= y);
return 0;
}
이는 다음과 같은 출력을 줍니다:
x == y: 0
x != y: 1
x > y: 0
x < y: 1
x >= y: 0
x <= y: 1
C에서는 0이 거짓이고, 0이 아닌 모든 값(보통 1)이 참입니다. 따라서 5는 실제로 8보다 작으며, 5와 8은 다릅니다.
논리 연산자: 의사결정을 내리는 자
논리 연산자는 우리 프로그래밍 마을의 지혜로운 이웃입니다. 이들은 더 간단한 조건을 결합하여 복잡한 결정을 내립니다.
여기 논리 연산자들입니다:
연산자 | 의미 | 예시 |
---|---|---|
&& | AND | (5 > 3) && (4 < 7)는 참 |
|| | OR | (5 > 8) || (4 < 7)는 참 |
! | NOT | !(5 > 8)는 참 |
이제 이들이 어떻게 작동하는지 보겠습니다:
#include <stdio.h>
int main() {
int a = 5, b = 3, c = 8;
printf("(a > b) && (c > a): %d\n", (a > b) && (c > a));
printf("(a > b) || (a > c): %d\n", (a > b) || (a > c));
printf("!(a > b): %d\n", !(a > b));
return 0;
}
이는 다음과 같은 출력을 줍니다:
(a > b) && (c > a): 1
(a > b) || (a > c): 1
!(a > b): 0
AND 연산자(&&)는 두 조건이 모두 참일 때만 참을 반환합니다. OR 연산자(||)는 적어도 하나의 조건이 참이면 참을 반환합니다. NOT 연산자(!)는 참 값을 뒤집습니다.
비트 연산자: 바이너리 마법사
이제 바이너리 마법의 영역에 들어갑니다. 비트 연산자는 숫자의 바이너리 표현을 직접 작업합니다. 이들은 프로그래밍 세계의 显微鏡과 같으며, 개별 비트를 보고 조작할 수 있게 합니다.
여기 비트 연산자들입니다:
연산자 | 이름 | 예시 |
---|---|---|
& | 비트 AND | 5 & 3 = 1 |
| | 비트 OR | 5 | 3 = 7 |
^ | 비트 XOR | 5 ^ 3 = 6 |
~ | 비트 NOT | ~5 = -6 |
<< | 왼쪽 시프트 | 5 << 1 = 10 |
>> | 오른쪽 시프트 | 5 >> 1 = 2 |
이제 이를 실행해 보겠습니다:
#include <stdio.h>
int main() {
unsigned int a = 5, b = 3; // 5는 101이고, 3은 011입니다.
printf("a & b = %u\n", a & b); // 101 & 011 = 001
printf("a | b = %u\n", a | b); // 101 | 011 = 111
printf("a ^ b = %u\n", a ^ b); // 101 ^ 011 = 110
printf("~a = %d\n", ~a); // ~101 = ...11111010 (이항 보수)
printf("a << 1 = %u\n", a << 1); // 101가 1010이 됩니다.
printf("a >> 1 = %u\n", a >> 1); // 101가 10이 됩니다.
return 0;
}
이는 다음과 같은 출력을 줍니다:
a & b = 1
a | b = 7
a ^ b = 6
~a = -6
a << 1 = 10
a >> 1 = 2
이 연산자들은 낮은 수준의 프로그래밍이나 코드 최적화를 할 때 매우 유용합니다.
대입 연산자: 값 변경자
대입 연산자는 우리 프로그래밍 세계의 서기입니다. 변수에 값을 기록하거나 할당합니다. 여기 우리의 대입 연산자들입니다:
연산자 | 예시 | 동등한 것 |
---|---|---|
= | x = 5 | x = 5 |
+= | x += 3 | x = x + 3 |
-= | x -= 2 | x = x - 2 |
*= | x *= 4 | x = x * 4 |
/= | x /= 2 | x = x / 2 |
%= | x %= 3 | x = x % 3 |
<<= | x <<= 2 | x = x << 2 |
>>= | x >>= 1 | x = x >> 1 |
&= | x &= 3 | x = x & 3 |
^= | x ^= 5 | x = x ^ 5 |
|= | x |= 3 | x = x | 3 |
이제 빠른 예제를 보겠습니다:
#include <stdio.h>
int main() {
int x = 10;
x += 5; // x는 이제 15입니다.
printf("After x += 5: %d\n", x);
x *= 2; // x는 이제 30입니다.
printf("After x *= 2: %d\n", x);
x %= 7; // x는 이제 2입니다. (30 % 7 = 2)
printf("After x %%= 7: %d\n", x);
return 0;
}
이는 다음과 같은 출력을 줍니다:
After x += 5: 15
After x *= 2: 30
After x %= 7: 2
이 연산자들은 코드를 더 간결하고 읽기 쉽게 만듭니다.
기타 연산자: 특수 부대
이제 우리의 다른 카테고리에 맞지 않는 특수 연산자들을 만나보겠습니다.
sizeof 연산자
sizeof
연산자는 변수나 데이터 형의 크기를 바이트 단위로 알려줍니다. 이는 우리 데이터의 측정卷자입니다.
#include <stdio.h>
int main() {
int x;
char c;
float f;
printf("Size of int: %zu bytes\n", sizeof(x));
printf("Size of char: %zu bytes\n", sizeof(c));
printf("Size of float: %zu bytes\n", sizeof(f));
return 0;
}
이는 시스템에 따라 다음과 같은 출력을 줄 수 있습니다:
Size of int: 4 bytes
Size of char: 1 byte
Size of float: 4 bytes
삼항 연산자
삼항 연산자는 간단한 if-else 문과 같습니다. condition ? value_if_true : value_if_false
형태로 쓰입니다.
#include <stdio.h>
int main() {
int x = 10;
int y = (x > 5) ? 1 : 0;
printf("y = %d\n", y);
return 0;
}
이는 다음과 같은 출력을 줍니다:
y = 1
x가 5보다 큰 이유로 y는 1이 할당됩니다.
연산자 우선순위: 계층 구조
마치 수학에서처럼, C는 연산자 우선순위를 가집니다. 이 우선순위는 여러 연산자가 하나의 표현에 사용될 때 어떤 연산이 먼저 수행되는지를 결정합니다.
여기 간단한 우선순위 표입니다. 가장 높은 우선순위부터 시작합니다:
우선순위 | 연산자 |
---|---|
1 | () [] -> . |
2 | ! ~ ++ -- + - * & (type) sizeof |
3 | * / % |
4 | + - |
5 | << >> |
6 | < <= > >= |
7 | == != |
8 | & |
9 | ^ |
10 | | |
11 | && |
12 | || |
13 | ?: |
14 | = += -= *= /= %= &= ^= |= <<= >>= |
15 | , |
불확실하다면, 괄호를 사용하여 의도를 명확히 하세요!
C의 다른 연산자: 숨겨진 보석
C에는 아직 다루지 않은 몇 가지 연산자가 있습니다:
- 쉼표 연산자 (,): 여러 표현을 사용할 수 있는 곳에서 단일 표현만을 기대하는 경우 사용합니다.
- 주소 연산자 (&): 변수의 메모리 주소를 반환합니다.
- 참조 연산자 (*): 특정 메모리 주소에 있는 값을 접근합니다.
- 구조체 구성원 연산자 (.): 구조체의 구성원에 접근합니다.
- 구조체 포인터 연산자 (->): 포인터를 통해 구조체의 구성원에 접근합니다.
이들을 더 자세히 탐구하기 위해서는 포인터와 구조체에 대해 더 알아야 합니다.
그리고 그렇습니다! 우리는 C 연산자의 마법적인 세계를 탐험하며, 기본적인 산술부터 복잡한 비트 연산까지 학습했습니다. 연습은 완벽의 열쇠입니다. 이 코드를 테스트하고 실험해 보며, C의 마법을 효과적으로 사용할 수 있도록 하세요! 코딩을 즐기고, 비트가 여러분의 성공을 위한 보석이 되길 바랍니다! ?♂️?
Credits: Image by storyset