C - 연산자: 프로그래밍 마법의 문

안녕하세요, 미래의 코딩 마법사들! ? 저는 여러분이 C 프로그래밍의 세계로 향하는 이 흥미로운 여정을 안내해 드리게 되어 기쁩니다. 오늘, 우리는 C에서의 연산자의 마법적인 영역을 탐험해 볼 것입니다. 아직 코드를 한 줄도 작성해본 적이 없다고 해도 걱정하지 마세요 – 저희는 매우 시작부터 함께 점진적으로 학습할 것입니다.

C - Operators

산술 연산자: 기본 마법

저희 프로그래밍 마법서에서 가장 간단한 마법으로 시작해 보겠습니다. 산술 연산자입니다. 이 연산자들은 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에는 아직 다루지 않은 몇 가지 연산자가 있습니다:

  1. 쉼표 연산자 (,): 여러 표현을 사용할 수 있는 곳에서 단일 표현만을 기대하는 경우 사용합니다.
  2. 주소 연산자 (&): 변수의 메모리 주소를 반환합니다.
  3. 참조 연산자 (*): 특정 메모리 주소에 있는 값을 접근합니다.
  4. 구조체 구성원 연산자 (.): 구조체의 구성원에 접근합니다.
  5. 구조체 포인터 연산자 (->): 포인터를 통해 구조체의 구성원에 접근합니다.

이들을 더 자세히 탐구하기 위해서는 포인터와 구조체에 대해 더 알아야 합니다.

그리고 그렇습니다! 우리는 C 연산자의 마법적인 세계를 탐험하며, 기본적인 산술부터 복잡한 비트 연산까지 학습했습니다. 연습은 완벽의 열쇠입니다. 이 코드를 테스트하고 실험해 보며, C의 마법을 효과적으로 사용할 수 있도록 하세요! 코딩을 즐기고, 비트가 여러분의 성공을 위한 보석이 되길 바랍니다! ?‍♂️?

Credits: Image by storyset