C언어 기초 4일차 : 연산자

bitterpotato·2020년 8월 29일
0

C언어 기초

목록 보기
4/7

I. 연산자의 정의


연산자는 영어로는 operand라고 한다.

말 그대로 연산을 하기 위해 사용되는 인자이다.


II. 연산자의 종류


일반적으로 피 연산자의 개수가 몇개 인지에 대해 구분한다.

참고


C언어에서는 boolean type이 원래는 존재하지 않는다.
따라서 이곳에서는 참을 1, 거짓을 0으로 표기하겠다.


1. 단항 연산자 (피연산자의 개수가 1개인 경우)


단항 연산자는 피연산자의 개수가 1개만 필요한 연산자를 말한다.


1) ++ (증가 연산자)


++은 증가 연산자로서 변수가 정수 혹은 실수일 경우 1을 증가시킨다.

p++;

위의 예시는 변수 p(정의되어 있을 때에 한함)의 값에 1을 더하는 것이다.

변수 자체의 값이 바뀜에 유의하자.


2) -- (감소 연산자)


--는 감소 연산자로서 변수가 정수 혹은 실수일 경우 1을 감소시킨다.

p--;

위의 예시는 변수 p(정의되어 있을 때에 한함)의 값에 1을 빼는 것이다.

변수 자체의 값이 바뀜에 유의하자.


3) ! (논리 연산자)


!는 논리 부정 연산자로서 0을 1로, 0이 아닌 것들을 0으로 바꾼다.

int p = 1;
!p;

위의 예시는 1인 p의 값을 0으로 바꾼다.

변수 자체의 값이 바뀜에 유의하자.


4) ~ (비트 부정 연산자)


~는 비트 별 부정 연산자로서 비트 별로 부정 연산을 시행한다. (아래 그림을 참조한다)

수정 : -32,768에서 -1로 바꿉니다.


5) & (참조 연산자)


&는 참조 연산자로서 포인터와 관련된 연산자이다. (추후 설명)


6) * (역참조 연산자)


*는 역참조 연산자로서 포인터와 관련된 연산자이다. (추후 설명)


7) sizeof() (크기를 구하는 연산자)


해당 변수 또는 문자가 메모리 상에서 얼마만큼의 크기를 차지하는지 알려주는 연산자이다.

short a = 0;
sizeof(a);

sizeof 연산의 결과 short 자료형의 크기인 2가 나온다. (출력은 되지 않는다)


8) 캐스팅 연산자


자료형을 변환할 때 이용되는 연산자이다. 사용 방법은 아래와 같다.

short a = 48;
(char) a;

연산의 결과 ASCII 코드 48에 해당하는 문자인 '0'이 나온다. (출력은 되지 않는다.)


2. 이항 연산자 (피연산자의 개수가 2개인 경우)


이항 연산자는 피연산자의 개수가 2개가 필요한 연산자를 말한다.


1) = (대입 연산자)


=는 대입 연산자로서 좌항에 우항의 값을 대입하는 연산자이다.

a = 6;

위의 예시는 변수 a(정의되어 있을 때에 한함)에 6을 대입하는 것이다.


2) == (비교 연산자)


==는 비교 연산자로서 좌항과 우항이 같은지 비교한다.

3 == 6;

위의 예시는 3과 6이 같은지 비교한다. (결과는 0)


3) != (비교 연산자)


!=는 비교 연산자로서 좌항과 우항이 다른지 비교한다.

3 != 6;

위의 예시는 3과 6이 다른지 비교한다. (결과는 1)


4) > (비교 연산자)


>는 비교 연산자로서 좌항이 우항보다 큰지 비교한다.

3 > 6;

위의 예시는 3이 6보다 큰지 비교한다. (결과는 0)


5) >= (비교 연산자)


>=는 비교 연산자로서 좌항이 우항보다 크거나 같은지 비교한다.

3 >= 6;

위의 예시는 3이 6보다 크거나 같은지 비교한다. (결과는 0)


6) < (비교 연산자)


<는 비교 연산자로서 좌항이 우항보다 작은지 비교한다.

3 > 6;

위의 예시는 3이 6보다 작은지 비교한다. (결과는 1)


7) <= (비교 연산자)


<=는 비교 연산자로서 좌항이 우항보다 작거나 같은지 비교한다.

3 > 6;

위의 예시는 3이 6보다 작거나 같은지 비교한다. (결과는 1)


8) + (사칙연산자)


+는 사칙연산자로서 좌항과 우항을 더하는 연산을 수행한다.

3 + 6;

위의 예시는 3과 6을 더하는 덧셈을 한다.
(결과는 9이나 저장 및 출력되지 않는다. 값을 받거나 출력될 방법이 없기 때문.)


9) - (사칙연산자)


-는 사칙연산자로서 좌항에서 우항을 빼는 연산을 수행한다.

3 > 6;

위의 예시는 3에서 6을 빼는 뺄셈을 한다.
(결과는 9이나 저장 및 출력되지 않는다. 값을 받거나 출력될 방법이 없기 때문.)


10) * (사칙연산자)


*는 사칙연산자로서 좌항과 우항을 곱하는 연산을 수행한다.

3 * 6;

위의 예시는 3과 6을 곱하는 곱셈을 한다.
(결과는 18이나 저장 및 출력되지 않는다. 값을 받거나 출력될 방법이 없기 때문.)


11) / (사칙연산자)


/는 사칙연산자로서 좌항을 우항으로 나누는 연산을 수행한다.

단, 정수를 정수로 나눌 경우 결과는 항상 정수이다.

아래의 예시를 보면서 이해해 보자.

3 / 6;

위의 예시는 3에서 6을 나누는 나눗셈을 한다.
(결과는 0이나 저장 및 출력되지 않는다. 값을 받거나 출력될 방법이 없기 때문.)

이렇듯 정수와 정수의 나눗셈은 피제수에서 나머지를 뺀 값을 제수로 나눈다고 생각하면 쉽다.

  • 제수 : 나누는 값 (여기서는 6)
  • 피제수 : 나누어지는 값 (여기서는 3)

단, 제수와 피제수 중 단 하나라도 실수라면, 결과는 항상 실수이다.

아래의 예시를 보면서 이해해 보자.

3.0 / 6;

위의 예시는 3.0(실수)에서 6을 나누는 나눗셈을 한다.
(결과는 0.5000000이나 저장 및 출력되지 않는다. 값을 받거나 출력될 방법이 없기 때문.)


참고로 어떤 수이든 0으로 나누면 오류가 난다.


12) % (나머지 연산자)


%는 나머지 연산자로서 좌항을 우항으로 나누어 남은 나머지를 연산한다.

3 % 6;

위의 예시는 3에서 6을 나누고 남은 나머지를 연산한다.
(결과는 3이나 저장 및 출력되지 않는다. 값을 받거나 출력될 방법이 없기 때문.)

참고 : 실수 % 정수 혹은 실수 % 실수는 항상 결과 값이 0이다.


13) & (비트 연산자)


비트 별로 AND 연산을 수행하는 연산자이다.


14) | (비트 연산자)


비트 별로 OR 연산을 수행하는 연산자이다.


15) ^ (비트 연산자)


비트 별로 XOR 연산을 수행하는 연산자이다.

참고 : XOR의 진리표



16) && (논리 연산자)


좌항과 우항이 모두 참이어야 참을 반환하는 연산자이다. (논리 AND 연산)

1 && 7;

1과 7은 모두 0이 아니므로 결과는 1이다.


17) || (논리 연산자)


좌항과 우항 둘 중 하나만이라도 참이면 참을 반환하는 연산자이다. (논리 OR 연산)

0 || 7;

0은 0이지만 7은 0이 아니므로 결과는 1이다.


18) >> (비트 연산자)


비트 별로 우항의 숫자만큼 밀어주는 연산자이다. (범위 밖은 자르고 빈 부분은 0으로 채운다.)


19) << (비트 연산자)


비트 별로 우항의 숫자만큼 당기는 연산자이다. (범위 밖은 자르고 빈 부분은 0으로 채운다.)


20) 복합 대입 연산자들


복합 대입 연산자의 종류에는 +=, -=, *=, /=. %= 등이 있다.

+=는 좌항에 우항을 더한 값을 다시 좌항에 대입하는 연산을 수행한다.

-=는 좌항에 우항을 뺀 값을 다시 좌항에 대입하는 연산을 수행한다.

*=는 좌항에 우항을 곱한 값을 다시 좌항에 대입하는 연산을 수행한다.

/=는 좌항에 우항을 나눈 값을 다시 좌항에 대입하는 연산을 수행한다.

나눗셈의 법칙은 / 연산자와 동일하다.

%=는 좌항에 우항을 나눈 나머지를 다시 좌항에 대입하는 연산을 수행한다.


3. 삼항 연산자 (피연산자의 개수가 3개인 경우)


삼항 연산자는 연산을 위해 피연산자의 개수가 3개 필요한 연산자를 말한다.


1) ? : (조건 연산자)


? : 연산자는 방식이 특이하다. 일반적으로 아래와 같이 사용하는데, 예제를 통해 더욱 자세히 알아보겠다.

(조건) ? (참일때 반환할 값) : (거짓일 때 반환할 값)

(a == 7) ? "True" : "False";

위 예제는 a(변수가 선언되어 있을 경우)가 7이면 True라는 텍스트를 반환하고, 7이 아니면 False라는 텍스트를 반환하게 하는 연산이다.

간단한 if문이라고 생각해도 무방하다.


덧. overflow


overflow란 자료형의 최대 크기를 넘어갈 경우 발생하는 것으로 연산 과정에서 자료형의 최대 크기가 넘어가 127에서 -128이 되버리는 등의 수학적으로 말이 안되는 결과가 나오기 때문에 발생한다.

이해를 위해서 아래의 그림을 참조하자.


Special Thanks


LJLee37 (Github : https://github.com/LJLee37, Twitch : https://www.twitch.tv/ljlee37)

profile
개발자 망생이

0개의 댓글