본문으로 바로가기

파일의 IT 블로그

  1. Home
  2. 프로그래밍 강좌/C
  3. [C언어 강좌] #6-1 연산자(Operator)

[C언어 강좌] #6-1 연산자(Operator)

· 댓글개 · KRFile

안녕하세요 파일입니다. 오늘 알아볼 것은 연산자입니다.

 

#include <stdio.h>

int main(){
	char c = 'A';
	printf("c의 논리적 주소 : &c, c의 물리적 주소, %x", &c);
	return 0;
}

c의 논리적 주소 : &c, c의 물리적 주소, 62fe1f
--------------------------------
Process exited after 0.01983 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

scanf에서 배웠던 내용으로 &변수 이름을 하면 변수의 메모리 주소가 나온다고 하였습니다.

위 예제에서 &c논리적 주소라고 하고62fe1f를 물리적 주소라고 합니다.

사람이 사용하기엔 &c라는 논리적 개념이 실제 메모리값인 62fe1f 보다 훨씬 사용하기 편합니다.

 

연산자의 종류

 

연산을 수행하는 기호를 연산자라고 합니다.  ex) +, -, *, %

연산자의 연산 대상이 되는 것을 피연산자라고 합니다.

C언어에서 연산을 수행할 때는 우선순위가 있고 다양한 연산자를 지원합니다.

 

분류 연산자
대입 연산자 =
산술 연산자 +, -, *, /, %
복합 대입 연산자 +=, -=, *=, /=, %=
증감 연산자 ++, --
관계 연산자 >, <, ==, !=, >=, <=
논리 연산자 &&, ||, !
조건 연산자 ? :
비트 논리 연산자 &, |, ^, ~
비트 이동 연산자 >>, <<

( 몰랐는데 티스토리에 표 테마 입히기 기능이 있었네요... 덕분에 훨씬 더 보기 좋아졌습니다. )

 

이 연산자를 하나하나 차근차근 알아보겠습니다.

 

대입 연산자

대입 연산자는 이 앞에서 계~속 사용해오던 =입니다.

include <stdio.h>

int main(){
	char c = 127;
	int a = 30;
	
	printf("%d %d", c, a);
	return 0;
}

127 30
--------------------------------
Process exited after 0.01988 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

설명할게 딱히 없네요. 알아두실 점은 대입 연산자의 우선순위는 오른쪽에서 왼쪽입니다.

연산자의 우선순위에 대해선 좀 있다가 설명하겠습니다.

 

산술 연산자

산술 연산자는 우리가 흔히 아는 사칙 연산입니다  +, - , * , /(나눗셈), %,(나머지)

#include <stdio.h>

int main(){
	int a = 15;
	int b = 4;
	printf("15 / 4 의 몫 : %d 나머지 : %d \n", a / b, a%b);
	printf("15 / 4 를 나눈값 : %f 나머지 : %d", a / b, a%b);
	
}

15 / 4 의 몫 : 3 나머지 : 3
15 / 4 를 나눈값 : 0.000000 나머지 : 3
--------------------------------
Process exited after 0.02032 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

나머진 생략하고 나눗셈 연산자나머지 연산자에 대해서 알아보겠습니다.

2번째 printf에서 나눈 값이 제대로 출력이 안 되는 이유는 피연산자인 a와 b가 둘 다 int(정수) 형식이기 때문입니다.

그리고 나머지 연산자에선 항상 양의 정수가 나와야 합니다.

 

복합 대입 연산자

복합 대입 연산자는 a = a + 2와 같이 산술 연산자와 대입 연산자를 하나로 나타내는 기호를 의미합니다.

a = a + 2를 축약해서 표현하면 a += 2로 나타낼 수 있습니다.

 

많이 사용되므로 꼭 알아둡시다.

종류 축약형
a = a + b a += b
a = a - b a -= b
a = a * b a *= b
a = a / b a /= b
a = a % b a %= b

 

예를 들면 a -= b는 a = a - b와 같은 표현입니다. 대입 연산자의 우선순위는 오른쪽-> 왼쪽 이므로

a - b의 연산이 먼저 수행되고 a라는 값에 대입됩니다.

 

증감 연산자

증감 연산자는 피연산자의 값을 1 증가 또는 1 감소시키는 연산자입니다 기호는 ++--입니다.

후에 나올 for문이나 while 문에서 유용하게 사용됩니다.

 

종류 설명
++a 먼저 1 증가후 연산함
a++ 연산 후 1증가 시킴
--a 먼저 1 감소 후 연산함
a-- 연산 후 1 감소시킴

먼저 증가한다는 말이 이해가 잘 안 가시죠?

예제로 보겠습니다.

 

#include <stdio.h>

int main(){
	int a = 15;
	int b = 9;
	
	printf("%d \n", a++); //먼저 출력 - 후 연산함 
	printf("%d \n", a);  // 연산된 값
	
	
	printf("%d \n", ++b); //먼저 연산 후 출력 
	printf("%d", b); 
	
	return 0;	

	
}

15
16
10
10
--------------------------------
Process exited after 0.01916 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

차이가 보이시나요? a의 초기값은 15, b의 초기값은 9 였습니다.

첫 번째 printf 출력에서 보면 a++ 를 사용하여 먼저 출력 후에 연산하였으므로

처음엔 15가 출력되고 a를 다시 출력해보면 앞에서 1 증가했으므로 16이 출력되는 걸 볼 수 있습니다.

 

반면에++b를 사용한 것은 먼저 연산(1 증가) 후 출력했으므로 처음에도 10, 이후에에도 10 이 출력되는걸

볼 수 있습니다. 

 

++b처럼 증감 연산자가 변수 앞에 위치하면전위 방식,

a++처럼 증감 연산자가 변수 뒤에 위치하면 후위 방식이라고 합니다.

 

참고로 a++ 는 a = a + 1과 동일한 코드입니다.

 

관계 연산자

관계 연산자는 우리가 수학 시간에 배우는 부등호를 포함합니다.

 

종류 설명
a >= b a가 b보다 크거나 같은지 비교
a <= b a가 b보다 작거나 같은지 비교
a == b a와 b가 같은지 비교
a != b a와 b가 같지 않은지 비교

 

부등호에 = 을 붙여주면 이상, 이하를 표현하여 비교할 수 있습니다.

다른지를 비교하려면!= 를 사용하고 같은지 비교하려면 == 를 사용합니다

여기서! 는 논리 연산자의 한 종류로 not의 의미입니다

 

여기서 잠깐! 그러면 관계 연산자로 비교를 했으면 값이 어떻게 출력이 될까요?

사람은 10이 5보다 작으면 아니라고 대답하고 10이 5보다 크면 예라고 대답합니다.

 

C언어에서는 참과 거짓을 1과 0으로 표현합니다. 1은 참, 0은 거짓입니다.

(언어마다 차이가 있으나 거의 동일합니다)

 

참고로 bool 자료형이란 것이 있는데 stdbool.h 를 import 하면 bool 논리 자료형을 사용할 수 있습니다

bool 자료형을 이용하게 되면 True와 False로 참과 거짓을 나타낼 수 있습니다

(stdbool.h C99부터 추가됨)

 

#include <stdio.h>

int main(){
	int a = 10;
	int b = 5;

	printf("%d 가 %d 보다 큰가 ? : %d \n", a,b , a > b);
	printf("%d 가 %d 보다 작은가 ? : %d \n", a,b , a < b);
	
	a = 5;
	b = 5;
	
	printf("%d 가 %d와 같은가 ? : %d \n", a, b, a==b);
	printf("%d 가 %d와 다른가? :  %d", a, b, a!=b);
	
	return 0;
	
	
}

10 가 5 보다 큰가 ? : 1
10 가 5 보다 작은가 ? : 0
5 가 5와 같은가 ? : 1
5 가 5와 다른가? :  0
--------------------------------
Process exited after 0.0195 seconds with return value 0
계속하려면 아무 키나 누르십시오 . . .

 

예제를 보면서 참 거짓을 확인해보세요 ^^

 

연산자 우선순위

C언어에는 다양한 연산자가 있다고 했습니다. 이러한 연산자에는 우선순위가 있습니다.

1 + 2 * 3라는 식에서는 우선순위가 곱셈이 더 높음으로 2 * 3을 먼저 계산하고 1을 더합니다.

덧셈을 먼저 하게 해주고 싶으면 (1 + 2) * 3 이런 식으로 괄호를 쳐주면 되겠고요.

 

그런데 3 * 10 % 5처럼 곱셈과 나눗셈처럼 우선순위가 동일한 연산자가

동시에 나오면 혼란스럽겠죠? 그래서 이 혼란을 피하기 위해

왼쪽부터 오른쪽으로 계산하라고 순서를 정해뒀습니다.

 

C언어의 연산자는 우선순위가 있고, 또 연산 방향이 정해져 있습니다.

이것을 알아야 나중에 뒤에서 헷갈리지 않을 겁니다.

 

모를 때마다 자주 보면서 눈에 익혀두세요 ^^ 이 많은 표를 다 외울 순 없으니깐요

 

우선순위 연산자 방향
1 ( ) [ ]  -> . ++(후위), --(후위) -> (왼쪽에서 오른쪽)
2 sizeof &(주소), ++(전위),
--(전위)! * + - (부호 표시)
-> (왼쪽에서 오른쪽)
3 * / % (곱셈 나눗셈 나머지) -> (왼쪽에서 오른쪽)
4 +(덧셈) -(뺄셈) -> (왼쪽에서 오른쪽)
5 << >> -> (왼쪽에서 오른쪽)
6 < <= > >= -> (왼쪽에서 오른쪽)
7 == != -> (왼쪽에서 오른쪽)
8 & (비트연산) -> (왼쪽에서 오른쪽)
9 ^ -> (왼쪽에서 오른쪽)
10 | -> (왼쪽에서 오른쪽)
11 && -> (왼쪽에서 오른쪽)
12 || -> (왼쪽에서 오른쪽)
13 ? (삼항연산) <- (오른쪽에서 왼쪽)
14 = += -= *= /=  %= &= ^= != <<= >>= <- (오른쪽에서 왼쪽)
15 , (콤마) -> (왼쪽에서 오른쪽)

 

비트 연산자는 내용이 기니 다음 강의에서 설명하겠습니다.

 

2편에서 계속됩니다.... 

SNS 공유하기
💬 댓글 개
이모티콘창 닫기
울음
안녕
감사해요
당황
피폐

이모티콘을 클릭하면 댓글창에 입력됩니다.