완숙의 블로그

연산자 (operator) 본문

Programing Language/C

연산자 (operator)

완숙 2018. 12. 31. 17:36

연산자 (operator)

연산자 & 피연산자

  • 연산자 : 산술연산자인 +, - , * , / 와 같이 이미 정의된 연산을 수행하는 기호
  • 피연산자 : 연산에 참여하는 변수나 값

 

연산자의 종류

2018-12-31 1 43 08

 

 

1. 대입연산자

  • 일반적 수학에서 사용하는 기호
  • LHS와 RHS가 다른의미를 가지고 있다.

 

Lvalue & Rvalue 구분

  • Lvalue : 변수, 수식을 넣을 수 있다.
  • Rvalue : 피연산자 변수만 넣을 수 있다.

 

2018-12-31 1 48 40

 

Example

#include <stdio.h>
int main() {
	
	int a, b = 0;
	
	a = 4;
	printf("a = 4 문장을 실행한 후 a의 값은 %d\n", a);
	
	a = a+3;
	printf("a = a + 3 문장을 실행한 후 a의 값은 %d\n", a);
	
	b = a + 2;
	printf("b = a + 2 문장을 실행한 후 b의 값은 %d\n", b);
	
	return 0;
}

/* 
프로세스가 시작되었습니다..
> a = 4 문장을 실행한 후 a의 값은 4
a = a + 3 문장을 실행한 후 a의 값은 7
b = a + 2 문장을 실행한 후 b의 값은 9
프로세스가 종료되었습니다.
*/

 

 

2. 산술 연산자

  • 산술 연산을 수행하는 연산자

  • 단항 연산자와 이항 연산자로 나뉨

    • 단항 연산자 : 피연산자를 1개를 필요로 하는 산술 연산자 문자에 부호를 붙이거나 증감시키는 것이 대표적임 ; +x, ++x
    • 이항 연산자 : 피연산자를 2개를 필요로 하는 산술 연산자 사칙연산이 대표적임 ; a + b
    • 삼항 연산자 : 피연산자 3개를 필요로 하는 산술 연산자

 

1) 단항 연산자

단항 연산자 중 증감연산자를 알아보자.

 

2018-12-31 2 03 35

 

왼쪽부터 순서대로 입력된다고 생각하면 쉽다.

a++ : 먼저 a를 넣고 나온 a에 대해 1 증가

++a : 증가한 a를 넣는다.

 

a = 10, b = 10 인 상황에서 이것을 적용해보면,

2018-12-31 2 07 04

 

이것을 도표로 나타내 차이를 살펴보자.


graph TD a++[x = a++] --> |1번째|A[x = a] A --> |2번째|B[a = a + 1] ++a[x = ++a] --> |1번째|C[a = a + 1] C --> |2번째|D[x = a]

 

Example

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

/*
프로세스가 시작되었습니다..
> a = 21, b = 22, c = 21


프로세스가 종료되었습니다.
*/

 

2) 이항 연산자

단순한 사칙 연산, 그리고 나머지 연산자를 포함한다.

 

2018-12-31 2 22 59

 

나눗셈 연산자와 나머지 연산자의 비교
int x, y = 9;
x = y / 2;   // x에 4가 저장된다.

x = y % 2;   // x에 1이 저장된다.

홀수, 짝수 검증하는데 사용한다.

 

Example
#include <stdio.h>
int main() {
	
	int a ,b = 0;
	int add, sub, mul, rem = 0;
	
	double div = 0;
	
	printf("1~100 사이 두 정수를 입력하시오 : ");
	scanf("%d %d", &a, &b);
	
	add = a + b;
	sub = a - b;
	mul = a * b;
	div = (double)a / b;
	rem = a % b;
	
	printf("%d + %d = %5d\n", a, b, add);
	printf("%d - %d = %5d\n", a, b, sub);
	printf("%d * %d = %5d\n", a, b, mul);
	printf("%d / %d = %5.3f\n", a, b, div);
	printf("%d %% %d = %5d\n", a, b, rem);
		
	return 0;
}


// 프로세스가 시작되었습니다..
1~100 사이 두 정수를 입력하시오 : 23 7
23 + 7 =    30
23 - 7 =    16
23 * 7 =   161
23 / 7 = 3.286
23 % 7 =     2

// 프로세스가 종료되었습니다.

 

 

3. 관계연산자

2018-12-31 3 22 37

 

Example
#include <stdio.h>

int main(void)
{
int score, grade;

printf("점수를 입력하세요 :");
scanf("%d", &score);

grade = (score >= 90);

if (grade == 1)
	printf("결과는 %d, 합격 \n", grade);
else
	printf("결과는 %d, 불합격 \n", grade);

	return 0;
}

/*
프로세스가 시작되었습니다..
> 점수를 입력하세요 :95
결과는 1, 합격

프로세스가 종료되었습니다.
*/

 

 

 

4. 논리 연산자

  • 조건 여러개를 결합하여 판정하는 연산자
  • AND, OR, NOT의 논리연산을 수행
  • 관계가 성립되면 참(1)을 표시
  • 성립되지 않으면 거짓(0)을 표시

 

논리 연산 진리표

2018-12-31 3 32 52

2018-12-31 3 31 04

 

논리 연산자의 우선 순위

graph LR A[논리부정 !] --> B[논리곱 &&] B --> C[논리합 ㅣㅣ]

 

Example 1
#include <stdio.h>
int main() {
	int a = 0, b = 1, c = 1;
	
	printf("논리 연산 1 && 1 || 0의 결과 : %d\n", 1 && 1 || 0);
	
	printf("논리 연산 1 && 0 || 1의 결과 : %d\n", 1 && 0 || 1);
	
	printf("논리 연산 1 && 0 || 0의 결과 : %d\n", 1 && 0 || 0);
	
	printf("논리 연산 1 && 0 || 0 && 1의 결과 : %d\n", b && a || a && c);
	
	printf("논리 연산 (1 && 0) || (0 && 1)의 결과 : %d\n", (b && a) || (a && c));
	
	return 0;
}

// 프로세스가 시작되었습니다..
논리 연산 1 && 1 || 0의 결과 : 1
논리 연산 1 && 0 || 1의 결과 : 1
논리 연산 1 && 0 || 0의 결과 : 0
논리 연산 1 && 0 || 0 && 1의 결과 : 0
논리 연산 (1 && 0) || (0 && 1)의 결과 : 0

// 프로세스가 종료되었습니다.

 

Example 2
#include <stdio.h>
int main() {
	int a = 0, b = 1, c = 1;
	
	printf("a < b && c > a의 결과 : %d\n", a < b && c > a);
	
	printf("a > b && c > a의 결과 : %d\n", a > b && c > a);
	
	printf("a > b || c > a의 결과 : %d\n", a > b || c > a);
	
	printf("괄호를 사용하는 것이 더 좋음\n");
	
	printf("(a > b) || (c > a)의 결과 : %d\n", (a > b) || (c > a));
	
	return 0;
}

//프로세스가 시작되었습니다..
a < b && c > a의 결과 : 1
a > b && c > a의 결과 : 0
a > b || c > a의 결과 : 1
괄호를 사용하는 것이 더 좋음
(a > b) || (c > a)의 결과 : 1

//프로세스가 종료되었습니다.

 

5. 비트 연산자

  • 피연산자 정수값을 비트 단위로 논리 연산을 수행하는 연산자
  • AND, OR, NOT의 기본 논리식으로 이루어짐

 

종류와 사용 예

2018-12-31 4 22 31

 

실제 계산 방법
  • 4비트 데이터에 대한 비트 연산

2018-12-31 4 24 32

 

  • 왼쪽 & 오른쪽 Shift 연산

    default

    << 연산 ( a << b )

    • a를 b만큼 왼쪽으로 비트를 이동시킴
    • a에 2^b을 곱한 값 ( a * 2^b )

    ( a >> b)

  1. ( a >> b)

    • a를 b만큼 오른쪽으로 비트를 이동시킴

    • a에 2^b로 나눈 값 ( a / 2^b )

       

Example
#include <stdio.h>
int main() {
	int a,b,c,d;
	
	int x =10, y = 7;
	
	a = x&y;
	b = x|y;
	c = x^y;
	d = ~x;
	
	printf("비트곱 x & y의 결과 : %d\n",a);
	printf("비트합 x | y의 결과 : %d\n",b);
	printf("배타적 논리합 x ^ y의 결과 : %d\n",c);
	printf("비트반전 ~x의 결과 : %d\n",d);
	
	return 0;
}

// 프로세스가 시작되었습니다..
비트곱 x & y의 결과 : 2
비트합 x | y의 결과 : 15
배타적 논리합 x ^ y의 결과 : 13
비트반전 ~x의 결과 : -11

// 프로세스가 종료되었습니다.

 

4. 축약 연산자

  • 연산 2개를 동시에 수행하여 값을 할당하는 연산자

 

종류와 사용 예

2018-12-31 4 58 31

 

Example
#include <stdio.h>
int main() {
	int a = 10;
	printf("초기값 : a = 10\n");
	
	a += 5;
	printf("a += 5 : %d\n", a);
	
	a = 10; a -= 5 + 2;
	printf("a -= 5 + 2 : %d\n",a);
	
	a = 10; a *= 2 + 5;
	printf("a *= 2 + 5 : %d\n",a);
	
	return 0;
}

// 프로세스가 시작되었습니다..
초기값 : a = 10
a += 5 : 15
a -= 5 + 2 : 3
a *= 2 + 5 : 70

// 프로세스가 종료되었습니다.

RHS 부터 수행한 후 연산자 처리를 하고 있다.

 

연산자 우선순위


graph LR 괄호[괄호] --> A A[단항] --> B[산술] B --> C[이동] C --> D[관계] D --> E[비트] E --> F[논리] F --> G[조건] G --> H[대입]
  • 혼동되므로 먼저 처리하려는 연산에 괄호 처리하는 것이 간편하다.

 

연산자 우선순위 표

2018-12-31 5 11 56

 

 

실습

Problem 1
  • 밑변 높이 입력 받아 삼각형의 면적을 구하는 프로그램을 작성하라. 면적은 소수 5째자리까지 출력
#include <stdio.h>
int main() {
	
	double a, b = 0;
	
	printf("밑변과 높이를 입력하시오 : ");
	scanf("%lf %lf", &a, &b);
	
	printf("삼각형의 면적은 %.5f", (a*b)/2);
	
	return 0;
}

// 프로세스가 시작되었습니다..
밑변과 높이를 입력하시오 : 3 7
삼각형의 면적은 10.50000
//프로세스가 종료되었습니다.



 

Problem 2
  • 두 정수를 입력받아 산술연산을 수행해라. 자리수는 5자리, 소수점 3자리까지 출력
#include <stdio.h>
int main() {
	
	int a ,b = 0;
	int add, sub, mul, rem = 0;
	
	double div = 0;
	
	printf("1~100 사이 두 정수를 입력하시오 : ");
	scanf("%d %d", &a, &b);
	
	add = a + b;
	sub = a - b;
	mul = a * b;
	div = (double)a / b;
	rem = a % b;
	
	printf("%d + %d = %5d\n", a, b, add);
	printf("%d - %d = %5d\n", a, b, sub);
	printf("%d * %d = %5d\n", a, b, mul);
	printf("%d / %d = %5.3f\n", a, b, div);
	printf("%d %% %d = %5d\n", a, b, rem);
		
	return 0;
}

// 프로세스가 시작되었습니다..
1~100 사이 두 정수를 입력하시오 : 23 7
23 + 7 =    30
23 - 7 =    16
23 * 7 =   161
23 / 7 = 3.286
23 % 7 =     2

// 프로세스가 종료되었습니다.

 

Problem 3
  • 방의 가로 세로 입력 받은 후, 면적을 평수로 출력하는 프로그램을 만들어라. (1평 = 3.305785제곱미터, 출력 소수점 2자리)
#include <stdio.h>
#define pyeong 3.305785

int main() {
	
	double a, b = 0;
	
	printf("가로 세로 입력하시오(단위 m) : ");
	scanf("%lf %lf",&a, &b);
	
	printf("원룸 가로 : %.2f , 세로 : %.2f 는 %.2f 평 입니다.",a, b, (a*b)/pyeong);
	
	return 0;
}

// 프로세스가 시작되었습니다..
가로 세로 입력하시오(단위 m) : 2.1 3.5
원룸 가로 : 2.10 , 세로 : 3.50 는 2.22 평 입니다.
//프로세스가 종료되었습니다.

 

Problem 4
  • 반지름을 입력 받아 구의 체적과 표면적을 구하는 프로그램을 만들어라.
#include <stdio.h>
#define pi 3.141592

int main() {
	
	double r = 0;
	
	printf("반지름을 입력하시오 : ");
	scanf("%lf", &r);
	
	printf("구 체적(V)은 %f 이다.\n", (4/3)*pi*r*r*r);
	printf("구 표면적(S)은 %f 이다.\n", 4*pi*r*r);

	return 0;
}

// 프로세스가 시작되었습니다..
반지름을 입력하시오 : 2
구 체적(V)은 25.132736 이다.
구 표면적(S)은 50.265472 이다.

//프로세스가 종료되었습니다.

 


'Programing Language > C' 카테고리의 다른 글

선택문  (0) 2019.01.03
중간 예제  (0) 2019.01.02
표준 입출력 함수  (0) 2018.12.28
기본 자료형  (0) 2018.12.27
프로그래밍 기본 개념  (0) 2018.12.27
Comments