연산자

이인혁·2024년 4월 30일

C

목록 보기
3/23

연산자란?

수학의 연산자가 수학적 연산을 위한 약속된 기호인 것처럼, C언어의 연산자도 C언어에서 제공하는 다양한 연산을 위해 약속된 기호이다.

1. 연산자의 종류

  1. 산술연산자 : + - * / %
  2. 부호연산자 : + -
  3. 관계연산자 : < > <= >= == !=
  4. 논리연산자 : && || !
  5. 조건연산자 : ? :
  6. 증감연산자 : ++ --
  7. 대입연산자 : = += -= *= /= %=
  8. 비트연산자 : & | ~ ^ >> <<
  9. 쉼표연산자 : ,
  10. sizeof연산자 : sizeof()

2. 산술연산자

  • 정수 + 정수 = 정수 -> 두 피연산자를 더합니다.
  • 정수 - 정수 = 정수 -> 두 피연산자를 뺍니다.
  • 정수 * 정수 = 정수 -> 두 피연산자를 곱합니다
  • 정수 / 정수 = 정수, 실수(몫) -> 두 피연산자를 나눕니다.

예시

#include <stdio.h>
int main() {
	// 정수 + 정수 = 정수
	// 정수 - 정수 = 정수
	// 정수 x 정수 = 정수
	// 정수 / 정수 = 실수, 정수
	// 정수 / 정수 = 정수
	int a = 20;
	int b = 30;
	int ret = 0;
	ret = a + b;
	printf("%d + %d = %d\n", a, b, ret);
	ret = a - b;
	printf("%d - %d = %d\n", a, b, ret);
	ret = a * b;
	printf("%d x %d = %d\n", a, b, ret);
	a = 1;
	b = 2;
	// 정수 / 정수 = 정수가 나옵니다.
	// 실수로 결과값을 받으려면 피연산자의 한쪽을 실수로 변환해서
	// 연산을 해야 합니다.
	ret = a / b;
	printf("%d / %d = %d\n", a, b, ret);
	float fret = a / b;
	printf("%d / %d = %f\n", a, b, fret);
	fret = a / (float)b; // (DataType) 형변환 연산자
	printf("%d / %d = %f\n", a, b, fret);
	return 0;
}

결과

20 + 30 = 50
20 - 30 = -10
20 x 30 = 600
1 / 2 = 0
1 / 2 = 0.000000
1 / 2 = 0.500000

참고 형변환 연산자는 변수의 DataType을 변환하고 싶을 때 변수 앞에 (DataType)을 붙여주면 형변환할 수 있습니다.

  • 정수 % 정수 = 정수(나머지) -> 두 피연산자를 나눕니다.

    예시

#include <stdio.h>
int main() {
	// % 나머지 연산자.
	// 피연산자의 값을 나눈 나머지를 구합니다.
	// 11 / 2 = 5 (몫)
	// 11 % 2 = 1 (나머지)
	// ? % 2 = 0 (짝수)
	// ? % 2 = 1 (홀수)
	// 임의의 값을 일정한 범위의 값으로 만들때 사용
	int randValue;
	int directValue;
	srand(time(NULL)); //시간에 따라 랜덤으로 값을 가진다.
	randValue = rand();
	directValue = randValue % 4;
	printf("randValue=%d directValue=%d\n", randValue, directValue);
	randValue = rand();
	directValue = randValue % 4;
	printf("randValue=%d directValue=%d\n", randValue, directValue);
	randValue = rand();
	directValue = randValue % 4;
	printf("randValue=%d directValue=%d\n", randValue, directValue);
	randValue = rand();
	directValue = randValue % 4;
	printf("randValue=%d directValue=%d\n", randValue, directValue);
	return 0;
}

결과

randValue=11757 directValue=1
randValue=4087 directValue=3
randValue=30603 directValue=3
randValue=11114 directValue=2

3. 부호연산자

부호를 바꿀 때 사용합니다.

예시

#include <stdio.h>
int main() {
	int a = 20;
	printf("a = %d\n", a);
	a = -a;
	printf("a = %d\n", a);
	return 0;
}

결과

a = 20
a = -20

4. 관계연산자

관계연산자는 대소와 동등의 관계를 따지는 연산자입니다.

예를들어서 a와 b라는 숫자 또는 변수가 있다면, 둘이 같은지 다른지, 누가 더 크고 작은지를 따지는 연산자입니다.

그래서 관계연산자를 두고 '비교연산자'라고도 합니다. 두 개의 값을 비교하기 때문입니다.

C언어에는 논리 타입(bool)이 없습니다. C언어에서는 정수값을 가지고 논리값을 처리합니다.
0은 거짓, 0이외값을 참으로 받아들이는 특징이 있습니다.

예시

#include <stdio.h>
int main() {
	int a = 10;
	int b = 20;
	int res;
	res = a < b;
	printf("a:%d < b:%d = %d\n", a, b, res);
	res = a > b;
	printf("a:%d > b:%d = %d\n", a, b, res);
	res = a <= b;
	printf("a:%d <= b:%d = %d\n", a, b, res);
	res = a >= b;
	printf("a:%d >= b:%d = %d\n", a, b, res);
	res = a == b;
	printf("a:%d == b:%d = %d\n", a, b, res);
	res = a != b;
	printf("a:%d != b:%d = %d\n", a, b, res);	
	return 0;
}

결과

a:10 < b:20 = 1
a:10 > b:20 = 0
a:10 <= b:20 = 1
a:10 >= b:20 = 0
a:10 == b:20 = 0
a:10 != b:20 = 1

5. 논리연산자

논리 연산자란
&& AND(논리곱)
|| OR(논리합)
! NOT(논리부정)
을 표현하는 연산자입니다.

예시

#include <stdio.h>
int main() {
	int True = 200;
	int False = 0;
	int res;
	printf("And 연산자 &&\n");
	// 논리 And 연산자는 FALSE 확률이 높은 것을 앞쪽에 배치하는 것이 유리합니다.
	res = True && True;
	printf("True && True = %d\n", res);
	res = True && False;
	printf("True && False = %d\n", res);
	res = False && True;
	printf("False && True = %d\n", res);
	res = False && False;
	printf("False && False = %d\n", res);
	printf("Or 연산자 ||\n");
	// 논리 OR 연산자는 TRUE 확률이 높은 것을 앞쪽에 배치하는 것이 유리합니다.
	res = True || True;
	printf("True || True = %d\n", res);
	res = True || False;
	printf("True || False = %d\n", res);
	res = False || True;
	printf("False || True = %d\n", res);
	res = False || False;
	printf("False || False = %d\n", res);
    // 논리 NOT 연산자
	printf("Not 연산자 !\n");
	res = !True;
	printf("!True = %d", res);
	res = !False;
	printf("!Flase = %d", res);
	return 0;
}

결과

And 연산자 &&
True && True = 1
True && False = 0
False && True = 0
False && False = 0
Or 연산자 ||
True || True = 1
True || False = 1
False || True = 1
False || False = 0
Not 연산자 !
!True = 0!Flase = 1

관계연산자와 논리연산자

관계연산자와 논리연산자는 둘 다 논리값을 반환하기 때문에 섞어서 조건문에 사용할 수 있습니다.

예시

#include <stdio.h>
int main() {
	int xvalue = 0;
	int res;
	printf("임의의 정수값을 입력하세요:");
	scanf_s("%d", &xvalue);
	res = (xvalue > 0) && (xvalue < 10);
	if (res)
		printf("x:%d는 0과 10사이에 있다.", xvalue);
	else
		printf("x:%d는 0과 10사이에 없다.", xvalue);
	return 0;
}

결과1

임의의 정수값을 입력하세요:5
x:5는 0과 10사이에 있다.

결과2

임의의 정수값을 입력하세요:12
x:12는 0과 10사이에 없다.

(x, y)가 사각형(0, 0) ~ (10, 10)사이에 있는지 없는지를 판단하는 로직을 만들어보겠습니다.

코드

#include <stdio.h>
int main() {
	int x;
	int y;
	int topLeftx = 0;
	int topLefty = 0;
	int bottomRightx = 10;
	int bottomRighty = 10;
	printf("x값을 입력:");
	scanf_s("%d", &x);
	printf("y값을 입력:");
	scanf_s("%d", &y);
	if (x >= topLeftx && x <= bottomRightx && y >= topLefty && y <= bottomRighty)
		printf("(x, y)가 사각형(0, 0) ~ (10, 10) 안에 있습니다.\n");
	else
		printf("(x, y)가 사각형(0, 0) ~ (10, 10) 안에 없습니다.\n");
	return 0;
}

결과1

x값을 입력:1
y값을 입력:2
(x, y)가 사각형(0, 0) ~ (10, 10) 안에 있습니다.

결과2

x값을 입력:5
y값을 입력:12
(x, y)가 사각형(0, 0) ~ (10, 10) 안에 없습니다.

6. 조건연산자

조건연산자는 기호?와 기호:으로 이루어져 있으며, 두 개의 기호가 서로 떨어져 하나의 연산자를 구성하기 때문에 피연산자를 3개까지 둘 수 있는 것입니다.
예) max = (a > b) ? a: b;

예시

#include <stdio.h>
int main() {
	int a = 1;
	int b = 2;
	int ret = a > b ? a : b;
	printf("%d와 %d 중에 %d가 크다\n", a, b, ret);
	a > b ? printf("a:%d가 b:%d보다 크다", a, b) : printf("a:%d가 b:%d보다 작거나 같다", a, b);
	return 0;
}

결과

1와 2 중에 2가 크다
a:1가 b:2보다 작거나 같다

7. 증감연산자

증감연산자는 변수에 저장된 값을 1증가 및 감소시키는 경우에 사용되는 연산자입니다.

연산자연산자의 기능
++num값을 1 증가 후, 속한 문장의 나머지를 진행(선 증가, 후 연산)
num++속한 문장을 먼저 진행한 후, 값을 1증가(선 연산, 후 증가)
--num값을 1 감소 후, 속한 문장의 나머지를 진행(선 감소, 후 연산)
num--속한 문장을 먼저 진행한 후, 값을 1 감소(선 연산, 후 감소)

예시

#include <stdio.h>
int main() {
	int a = 20;
	int c = 0;
	printf("++연산자\n");
	printf("a = %d\n", a);
	++a; //전위식
	//a = a + 1;
	printf("++a = %d\n", a);
	a++; //후위식
	//a = a + 1;
	printf("a++ = %d\n", a);
	c = ++a;  //전위식
	//a = a + 1;
	//c = a;
	printf("c = ++a => c = %d, a = %d\n", c, a);
	c = a++; //후위식
	//c = a;
	//a = a + 1;
	printf("c = a++ => c = %d, a = %d\n", c, a);
	printf("--연산자\n");
	--a;
	//a = a - 1;
	printf("--a = %d\n", a);
	a--;
	//a = a - 1;
	printf("a-- = %d\n", a);
	c = --a;
	//a = a - 1;
	//c = a;
	printf("c = --a => c = %d, a = %d\n", c, a);
	c = a--;
	//c = a;
	//a = a - 1;
	printf("c = a-- => c = %d, a = %d\n", c, a);
	return 0;
}

결과

++연산자
a = 20
++a = 21
a++ = 22
c = ++a => c = 23, a = 23
c = a++ => c = 23, a = 24
--연산자
--a = 23
a-- = 22
c = --a => c = 21, a = 21
c = a-- => c = 21, a = 20

8. 대입연산자

오른쪽의 값을 왼쪽에 연산 대입하는 연산자입니다.

예시

#include <stdio.h>
int main() {
	int a = 0;
	int b = 100;
	float c = 1.5f;
	a = c;//기본 데이터 타입간에 대입은 컴파일러가 형변환을 자동으로 시켜줍니다.
	      //컴파일러가 형변환을 하는 것을 묵시정 형변환이라고 합니다
	//실수값을 정수형 변수에 대입할 때는 묵시적형변환을 하시면 안됩니다.
	printf("a = %d\n", a);
	//실수값을 정수형변수에 대입할 때는 명시적 형변환을 하셔야 합니다.
	//해당 변환이 의도된 변환이라는 것을 명확히 해야합니다.
	a = (int)c;
	printf("a = %d\n", a);
	//정수값을 실수형변수에 대입할 때 묵시적 형변환을 해도 됩니다.
	//값의 유실이 발생하지 않습니다.
	c = a;
	//대입 연산자 축약형
	a += 1; //축약형
	//a = a + 1;
	printf("a = %d\n", a);
	a *= 2;
	//a = a * 2;
	printf("a = %d\n", a);
	a /= 2;
	//a = a / 2;
	printf("a = %d\n", a);
	a %= 2;
	//a = a % 2;
	printf("a = %d\n", a);
	return 0;
}

결과

a = 1
a = 1
a = 2
a = 4
a = 2
a = 0

9. 비트연산자

비트는 컴퓨터가 표현하는 데이터의 최소단위로서 2진수 값 하나를 저장할 수 있는 메모리의 크기를 뜻하는 단위입니다. 또한 비트를 여덟 개 묶으면 바이트라는 단위가 구성됩니다.

컴퓨터는 2진수를 기반으로 데이터를 표현하고 연산도 진행합니다. 비트단위로 '0'과 '1'로 2진수를 보통 표현하는데 우리가 '10'이라고 입력하면 2진수로 변환해서 읽어들인다. 그래서 비트단위로 연산하는 비트연산자가 존재한다.

비트 연산자(비트단위로 같은자리 비교)

  • & 비트 And (둘 다 1인경우 1반환)
  • | 비트 Or (둘중 하나만 1이어도 1반환)
  • ~ 비트 Not (0이면 1, 1이면 0반환)
  • ^ 비트 Xor -> 배타적 Or (같으면 0 다르면 1반환)
  • >> 오른쪽 shift (오른쪽으로 한 칸씩 이동)
  • << 왼쪽 shift (왼족으로 한 칸씩 이동)

예시1

#include <stdio.h>
int main() {
	unsigned char a = 2; //00000010
	unsigned char b = 3; //00000011
	unsigned char c = 0; //00000000
	c = a & b;
	//   a:00000010
	//   b:00000011
	// a&b:00000010
	printf("c = %d\n", c);
	c = a | b;
	//   a:00000010
	//   b:00000011
	// a|b:00000011
	printf("c = %d\n", c);
	c = ~a;
	//   a:00000010
	//  ~a:11111101
	printf("c = %d\n", c);
	c = a ^ b;
	//   a:00000010
	//   b:00000011
	// a^b:00000001
	printf("c = %d\n", c);
	return 0;
}

결과1

c = 2
c = 3
c = 253
c = 1

예시2

#include <stdio.h>
int main() {
	// shift 연산자
	// << left shift 연산자
	// >> right shift 연산자
	unsigned short a = 1;        // 00000000 00000001
	// 왼쪽으로 1비트를 민다는 의미는? x2
	a = a << 1; // a변수의 비트값을 왼쪽으로 1비트 밀어라.
	// 00000000 00000001
	// 00000000 00000010 (2)
	printf("a << 1 => a = %d\n", a);
	a = a << 2;
	// 00000000 00000010 (2)
	// 00000000 00001000 (8)
	printf("a << 2 => a = %d\n", a);
	a = a << 2;
	// 00000000 00001000 (8)
	// 00000000 00100000 (32)
	printf("a << 2 => a = %d\n", a);
	// 오른쪽 shift
	// 오른쪽으로 1비트를 민다는 의미는? /2
	a = a >> 1;
	// 00000000 00100000 (32)
	// 00000000 00010000 (16)
	printf("a >> 1 => a = %d\n", a);
	a = a >> 2;
	// 00000000 00010000 (16)
	// 00000000 00000100 (4)
	printf("a >> 2 => a = %d\n", a);
	return 0;
}

결과2

a << 1 => a = 2
a << 2 => a = 8
a << 2 => a = 32
a >> 1 => a = 16
a >> 2 => a = 4

참고 오른쪽 shift연산은 값을 1/2배, 왼쪽 shift연산을 값을 2배 한다.

10. 쉼표연산자

문장을 이어서 쓸 때 사용합니다.

예시

#include <stdio.h>
int main() {
    // 쉼표 연산자
    // 문장을 이어서 쓸때 사용
    int a = 0, b = 10, c = 100;
    printf("a = %d, ", a), printf("b = %d, ", b), printf("c = %d\n", c);
}

결과

a = 0, b = 10, c = 100

11. sizeof연산자

sizeof연산자는 자료형이나 변수의 크기를 바이트단위로 반환하는 연산자입니다.

예시

#include <stdio.h>
int main() {
    // DataType
    printf("short = %d\n", sizeof(short));
    printf("unsigned int = %d\n", sizeof(unsigned int));
    printf("float = %d\n", sizeof(float));
    printf("double = %d\n", sizeof(double));
    //변수의 사이즈
    short d;
    unsigned int e;
    float f;
    double g;
    printf("변수 c의 byte 사이즈는 : %d\n", sizeof (d));
    printf("변수 d의 byte 사이즈는 : %d\n", sizeof (e));
    printf("변수 e의 byte 사이즈는 : %d\n", sizeof (f));
    printf("변수 f의 byte 사이즈는 : %d\n", sizeof (g));
    return 0;
}

결과

short = 2
unsigned int = 4
float = 4
double = 8
변수 c의 byte 사이즈는 : 2
변수 d의 byte 사이즈는 : 4
변수 e의 byte 사이즈는 : 4
변수 f의 byte 사이즈는 : 8

참고 sizeof연산자는 실행중에 작동하는 연산자가 아니고, 컴파일 과정에서 작동하는 연산자입니다. 따라서 다음과 같은 코드에서는 오류가 납니다
예) for(int i = 0; i < sizeof(num); i++)

profile
게임개발공부블로그

0개의 댓글