연산자 (operator)
연산자 & 피연산자
- 연산자 : 산술연산자인 +, - , * , / 와 같이 이미 정의된 연산을 수행하는 기호
- 피연산자 : 연산에 참여하는 변수나 값
연산자의 종류
1. 대입연산자
- 일반적 수학에서 사용하는 기호
- LHS와 RHS가 다른의미를 가지고 있다.
Lvalue & Rvalue 구분
- Lvalue : 변수, 수식을 넣을 수 있다.
- Rvalue : 피연산자 변수만 넣을 수 있다.
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개를 필요로 하는 산술 연산자
문자에 부호를 붙이거나 증감시키는 것이 대표적임 ;
1) 단항 연산자
단항 연산자 중 증감연산자를 알아보자.
왼쪽부터 순서대로 입력된다고 생각하면 쉽다.
a++ : 먼저 a를 넣고 나온 a에 대해 1 증가
++a : 증가한 a를 넣는다.
a = 10
, b = 10
인 상황에서 이것을 적용해보면,
이것을 도표로 나타내 차이를 살펴보자.
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) 이항 연산자
단순한 사칙 연산, 그리고 나머지 연산자를 포함한다.
나눗셈 연산자와 나머지 연산자의 비교
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. 관계연산자
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)을 표시
논리 연산 진리표
논리 연산자의 우선 순위
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의 기본 논리식으로 이루어짐
종류와 사용 예
실제 계산 방법
- 4비트 데이터에 대한 비트 연산
왼쪽 & 오른쪽 Shift 연산
- a를 b만큼 왼쪽으로 비트를 이동시킴
- a에 2^b을 곱한 값 ( a * 2^b )
<< 연산 ( a << b )
( a >> b)
( 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개를 동시에 수행하여 값을 할당하는 연산자
종류와 사용 예
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[대입]
- 혼동되므로 먼저 처리하려는 연산에 괄호 처리하는 것이 간편하다.
연산자 우선순위 표
실습
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 이다.
//프로세스가 종료되었습니다.