본문 바로가기
프로그래밍/C

그 외 연산자

by 길냥이 2025. 4. 16.
728x90

목차

  1. 형 변환 연산자
  2. sizeof 연산자
  3. 복합대입 연산자
  4. 콤마 연산자
  5. 조건 연산자
  6. 비트 연산자
  7. 연산자 우선순위

 

1. 형 변환 연산자

여기서 배울 연산자들은 좀 특이하게 생겼습니다.

근데 없으면 좀 답답하니, 알아두셔야해요.

아니 그냥 알아두세요

 

형 변환 연산자는 피연산자의 값을 원하는대로 바꿉니다. 

정수를 실수로, 실수를 정수로, 정수를 문자로.. 말이죠.

예를 들어 볼까요? 

int a = 10; 이라고 해 봅시다. 그러면 이 a 는 10입니다. 그리고 정수죠.

하지만 나는 저걸 실수로 쓰고 싶어요!

그러면 (float)a 처럼 사용하시면 됩니다. 

다른걸 바꾸고 싶으시다면 (변환자)변수 로 쓰시면 됩니다.

 

여담으로, 정수를 실수로 바꾸는 경우에는 뒤에 .0이 붙고.

실수를 정수로 바꾸는 경우에는 소수점 뒤가 그냥 잘린다는 사실

 

그럼 바로 실습해봅시다.

#include <stdio.h>

int main()
{
    int a = 20;
    int b = 3;
    double res = 0.0;

    printf("a = %d, b = %d\n", a, b);
    res = (double)a / b;                //(double) 를 이용한 실수 연산

    printf("a / b = %lf\n", res);
    printf("a / b = %d\n", (int)res );  //(int)를 이용해 res의 값에서 정수 부분만 추림


    return 0;
}

좋아요, 결과값은..

a = 20, b = 3
a / b = 6.666667
a / b = 6

으로 나옵니다.

 

처음부터 a와 b를 double형으로 선언하는 방법도 있지만, double형은 저장공간을 많이 차지하고 연산속도가 느려요.

그래서 int형을 기본으로 사용하고 실수 연산이 필요할 때 바꿔 사용하는 것이 좋습니다.

 

2. sizeof 연산자

이전에도 한번 써봤죠. 사용법은 위와 비슷해요. sizeof(값)을 하면 끝, 괄호의 위치가 바뀜에 유의하세요.

이전에는 연산하고 넣었는데, 보통 sizeof의 값은 한번만 확인하고 말 거기 때문에 위에처럼 printf문에 처리해두는게 좋아요.

 

그럼 바로 실습

#include <stdio.h>

int main()
{
    int a = 20;
    double b = 3.14;

    printf("int형 변수의 크기 : %d\n", sizeof(a));
    printf("double형 변수의 크기 : %d\n", sizeof(b));
    printf("정수형 상수의 크기 : %d\n", sizeof(12345678));
    printf("수식의 결과값(double형)의 크기 : %d\n", sizeof(a / b));

    return 0;
}

결과는 이렇게 나와요.

int형 변수의 크기 : 4
double형 변수의 크기 : 8
정수형 상수의 크기 : 4
수식의 결과값(double형)의 크기 : 8

사실 sizeof의 뒤에 괄호를 안 붙여도 처리를 해주기는 해요, 다만 그럴 경우에는 수식 1개만 처리하기 때문에..

 

3. 복합대입 연산자

음 복합대입연산자는 이런거에요.

우리가 프로그래밍을 할때, for문을 쓰든.. 아무튼 수량 자체를 늘리거나 줄이는 방법을 자주 써요.

물론 a = a + 1; 도 쓸 수는 있겠지만, 이건 꽤나 귀찮아요. 심지어 a가 2개나 들어가잖아요

 

이러한 귀찮음을 위해 나온 것이 바로 복합대입 연산자입니다.

복합대입 연산자는 산술 복합대입 연산자와 비트 복합대입 연산자가 존재해요.

복합대입 연산자 동일 연산자 의미
a += b a = a + b a에 b를 더함
a -= b a = a - b a에 b를 뺌
a *= b a = a * b a에 b를 곱함
a /= b a = a / b a를 b로 나눔
a %= b a = a % b a를 b로 나눈 나머지를 구함
 
a &= b a = a & b a와 b의 비트 AND 연산
a ^= b a = a ^ b a와 b의 비트 XOR 연산
a |= b a = a | b a와 b의 비트 OR 연산
a <<= b a = a << b  a를 왼쪽으로 b만큼 시프트
a >>= b a = a >>  b a를 오른쪽으로 b만큼 시프트

흠, 일단 산술 복합대입 연산자부터 실습해봅시다. 아직 비트는 안 배웠으니..

#include <stdio.h>

int main()
{
    int a = 10, b = 20, c = 3;

    a += 40;    //a에 40을 더한 결과를 다시 a에 저장
    b *= c;     //b에 c를 곱한 결과를 다시 b에 저장

    printf("a + 40 = %d\n", a);
    printf("b * c = %d\n", b);

    return 0;
}

좋아요, 여담으로 복합대입 연산자는 저장되는 공간과 연산되는 공간이 다르답니다.

 

결과는 다음과 같아요.

a + 40 = 50
b * c = 60

 

 

4. 콤마 연산자

사실 콤마 연산자는 이미 한번 쓰였어요, 사실 자주 써 왔죠.

printf("%d%d%d",a,b,c)라던가, int a = 0, b = 0; 이라던가 마링에요.

 

보시면 알겠지만, 콤마 연산자는 한 번에 여러 개의 수식을 나열해야 할 때 사용합니다.

그리고 왼쪽부터 오른쪽까지 순차적으로 연산해요.

그리고 콤마 연산자는 우선순위가 제일 아래입니다.

그래서 대입 연산자와 같이 사용하려면 괄호가 필요해요, int a = 0, b = 0;과 비슷한 맥락이죠.

 

한번 써 볼까요..

#include <stdio.h>

int main()
{
    int a = 10, b = 100;
    int c = 0;

    c = (++a, ++b);  //차례로 연산이 수행되며 c에는 ++b가 저장됨

    printf("%d", c);

    return 0;
}

결과를 보면

 

101

이 나와요, 콤마 연산자의 재일 끝에 있는 ++b가 연산되어 c에 101이 들어간 거죠.

만약 괄호가 없다면 콤마 연산자는 대입 연산자보다 나중에 처리되기에 c에는 11이 들어갈거에요.

 

콤마 연산자는 세미콜론 사용이 불가능한 구조에서 사용되요, 대표적으로 for문을 선언할 때 여럿을 선언할 때 사용하죠.

ex) for(a = 0, b =20; a < b; a++, b--)

처럼 말이죠.

 

5. 조건 연산자

조건 연산자는 유일한 삼항 연산자로 ?와 :을 사용해요.

조건 연산자는 (  수식 ? 값1 : 값2  ) 의 구조를 가져요.

만약 수식의 값이 참이면 값1이 선택되고, 수식의 값이 거짓이면 값2가 선택된답니다.

scanf와 같이 사용해보죠.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int a = 0, b = 0;
    int ret = 0;

    printf("두 수를 입력하세요 : ");
    scanf("%d %d", &a, &b);
    ret = (a > b) ? a : b;  //a와 b 중 큰 값이 ret에 저장됨

    printf("%d", ret);

    return 0;
}

짜잔, 이렇게 두 수 중 더 큰 수를 구하는 프로그램을 만들 수 있어요.

물론 저 값1 값2에 대입식을 괄호안에 집어넣을 수도 있어요.

 

조건 연산자를 연산자라 말하지만, 실제로는 if else문과 비슷하게 동작하므로 제어문으로 보는 것이 맞아요.

하지만 수식 형태이기 때문에 여기서 설명했어요.

 

6. 비트 연산자

비트 연산자는 데이터를 비트 단위로 연산해요.

위쪽에 복합대입 연산자에서 잠깐 설명했는데, 종류는 별반 다르지 않아요.

한번 실습해볼까요..

#include <stdio.h>

int main()
{
    int a = 11;       //비트열 00000000 00000000 00000000 00001011
    int b = 9;        //비트열 00000000 00000000 00000000 00001001

    printf("a & b = %d\n", a & b);
    printf("a ^ b = %d\n", a ^ b);
    printf("a | b = %d\n", a | b);
    printf("~a = %d\n", ~a);
    printf("a << 1 = %d\n", a << 1);
    printf("a >> 1 = %d\n", a >> 1);

    return 0;
}

흠, 하나씩 까볼까요.

 

비트 논리곱(&)은 비트에 AND 연산을 처리해요.

1011

1001

--> 1001 로 연산되어서 9가 나와요.

 

비트 베타적 논리합(^)은 비트에 XOR 연산을 처리해요.

1011

1001

--> 0010 으로 연산되어서 2가 나와요.

 

비트 논리합(|)은 비트에 OR 연산을 처리해요.

1011

1001

--> 1011 으로 연산되어서 11이 나와요.

 

비트 부정(~)은 비트를 반전시켜요.

0(×24)00001011

--> 1(×24)11110100 으로 연산되어서 -12가 나와요.

 

비트 이동(<<)은 비트를 왼쪽으로 1칸 이동시켜요.

0000 1011

-->  0001 0110 으로 연산되어서 22가 나와요.

 

비트 이동(>>)은 비트를 오른쪽으로 1칸 이동시켜요.

0000 1011

-->  0000 0101 으로 연산되어서 5가 나와요.

 

따라서 결과를 보면...

a & b = 9
a ^ b = 2
a | b = 11
~a = -12
a << 1 = 22
a >> 1 = 5

이에요.

비트연산자는 있기는 하지만, 그렇게 자주 쓰이지는 않아요.

가끔 쓰면 데이터 처리에 도움이 되는데.. 그냥 이런게 있다! 하고 넘어갑시다.

 

7. 연산자 우선순위

자, 수학에도 계산에 순서가 있듯이 연산자에도 우선순위가 있어요.

기본적으로는 단항 연산자가, 그 다음으로 이항 연산자가, 마지막으로 삼항 연산자 순서이고

산술 연산 -> 비트 이동 연산 -> 관계 연산 -> 논리 연산 순으로 연산됩니다.

 

사실 귀찮으면 그냥 괄호를 때려박으면 된답니다.

괄호가 너무 많아서 가독성을 해친다고요? 식을 쪼개세요. 그 정도의 식이면 괄호 없어도 가독성이 작살납니다.

종류 우선순위 연산자 연산 방향
1차 연산자 1 ( )   [ ] . -> > > > > >
단항 연산자 2 -   ++   --   ~   !   &   sizeof   (type) < < < < <
산술 연산자 3 *   /   % > > > > >
4 +   -
비트 이동 연산자 5 <<   >>
관계 연산자 6 <   <=   >   >=
동등 연산자 7 ==   !=
비트 논리 연산자 8 &
9 ^
10 |
논리 연산자 11 &&
12 ||
조건 연산자 13 ? :
대입 연산자 14 =   +=   -=   *=   /=   %=   &=   ^=   |=   <<=   >>= < < < < <
콤마 연산자 15 , > > > > >

방금 말했지만, 귀찮으면 그냥 괄호때리세요.

이걸 외우지는 말고..

728x90

'프로그래밍 > C' 카테고리의 다른 글

switch ~ case문  (0) 2025.04.18
if문  (0) 2025.04.18
기본 연산자  (0) 2025.04.15
데이터 입력  (0) 2025.04.15
변수  (0) 2025.04.14