입출력 함수와 연산자 - 2
연산자의 기능과 사용방법, 우선순위.
학습 목표
- 연산자.
- 연산자의 우선순위 이해.
주요 용어
- 연산자 (operator) : 임의의 자료에 대해 각종 연산을 수행하도록 하는 기호.
- 이항 연산자 : 2개의 자료를 재상으로 산술적인 처리를 수행하는 연산자.
- 단항 연산자 : 1개의 자료만을 대상으로 산술적인 처리를 수행하는 연산자.
- 관계 연산자 : 피 연산자에 대한 대.소 관계를 비교하는 연산자.
- 논리 연산자 : 피 연산자에 대한 논리연산(AND, OR, NOT)을 수행하는 연산자.
- 대입 연산자 : '='를 사용하여, 연산자의 오른쪽을 왼쪽에 대입하는 데 사용.
- 조건 연산자 : 주어진 조건의 만족여부에 따라 지정된 수식을 수행하는 연산자.
- 비트 연산자 : 수치를 2진수로 변환하여 bit 단위의 연산을 수행하는 연산자.
- 기타 연산자 : sizeof(), cast(형변환), &(주소 연산자), *(내용 연산자) 등.
- 연산자 우선순위 : 모든 연산자에는 연산자 우선순위가 정해져 있음.
연산자
임의의 자료에 대해 각종 연산을 수행하도록 하는 기호.
구분 |
연산자 |
산술 연산자 |
+ - * / % ++ -- |
관계 연산자 |
> < >= <= == != |
논리 연산자 |
& || ! |
대입 연산자 |
+= -= *= /= %= <<= >>= != |
조건 연산자 |
?: |
비트 연산자 |
& | ^ ~ << >> |
기타 연산자 |
sizeof() cast & . |
#include <stdio.h>
int main()
{
int x, y;
x = 10, y = 3;
printf("x + y = %d\n", x + y);
printf("x / y = %d\n", x / y);
printf("x %% y = %d\n", x % y);
printf("y %% x = %d\n", y % x);
return 0;
}
산술 연산자
피 연산자에 대해 사칙연산을 포함한 각종 산술연산을 수행하는 연산자.
구분 |
연산자 |
기능 |
예 |
이항 연산자 |
+ - * / |
가 감 승 제를 계산 |
i + 5 |
이항 연산자 |
% |
나눗셈의 나머지 계산 |
i % 5 |
단항 연산자 |
- |
부호의 반전 |
-5 |
단항 연산자 |
++ |
1 증가 |
i++, ++i |
단항 연산자 |
-- |
1 감소 |
i--, --i |
#include <stdio.h>
int main()
{
int x = 5, a, b;
a = ++x * x--;
b = x * 10;
printf("a = %d b = %d x = %d\n", a, b, x);
return 0;
}
관계 연산자
피 연산자에 대한 대,소 관계를 비교하는 연산자.
연산자 |
기능 |
예 |
== |
같은가의 여부 비교 |
a == b : a와 b는 같다. |
!= |
다른가의 여부 비교 |
a != b : a와 b는 같지 않다. |
> >= < <= |
대,소 관계 비교 |
a >= b : a는 b보다 크거나 같다. |
#include <stdio.h>
int main()
{
int a = 4, b, c, d;
b = a > 2;
printf("b = %d\n", b);
c = a < 2;
printf("c = %d\n", c);
d = a == 4;
printf("d = %d\n", d);
return 0;
}
논리 연산자
피 연산자에 대해 논리 연산을 수행하는 연산자.
연산자 |
기능 |
예 |
&& |
논리곱(AND) : 양쪽 모두 참일 때만 참 |
a && b |
|| |
논리합(OR) : 양쪽 중 하나라도 참이면 참 |
a || b |
! |
논리 부정(NOT) : 오른쪽이 참이면 거짓, 거짓이면 참 |
!a |
#include <stdio.h>
int main()
{
int a = 4, b = 7, c, d, e;
c = a > 2 & b <= 7;
printf("c = %d\n", c);
d = a < 2 || b <= 7;
printf("d = %d\n", d);
e = !a;
printf("e = %d\n", e);
return 0;
}
대입 연산자
연산자의 오른쪽을 왼쪽에 대입하는 연산자.
연산자 |
예 |
기능 |
= |
a = 5 |
a에 5를 대입 |
+= |
a += 5 |
a += 5 더한 후 결과를 대입 |
-= |
a -= 5 |
a -= 5 뺀 후 결과를 대입 |
*= |
a *= 5 |
a *= 5 곱한 후 결과를 대입 |
/= |
a /= 5 |
a /= 5 나눈 후 결과를 대입 |
%= |
a %=5 |
a %=5 나눈 후 그 나머지를 대입 |
&= |
a &= 5 |
a &= 5 bit 단위 AND 연산을 한 후 결과를 대입 |
|= |
a |= 5 |
a |= 5 bit 단위 OR 연산을 한 후 결과를 대입 |
^= |
a ^= 5 |
a ^= 5 bit단위 XOR 연산을 한 후 결과를 대입 |
<<= |
a <<= 5 |
a <<= 5 a의 값을 5 bit 좌로 이동 후 결과를 대입 |
>>= |
a >>= 5 |
a >>= 5 a의 값을 5비트 우로 이동 후 결과를 대입 |
#include <stdio.h>
int main()
{
int a = 10, b = 3, c = 1;
a *= (b - 1);
b /= 2 + 3;
c += 2;
printf("a = %d, b = %d, c = %d\n", a, b, c);
return 0;
}
조건 연산자
주어진 조건의 만족 여부에 따라 지정된 수식을 수행하는 연산자.
- 형식 : (조건) ? 수식1 : 수식2;
- 기능 : 조건이 성립하면 수식1, 성립하지 않으면 수식2를 실행
- 사용 예 : x = (5 > 2) ? 1 : 0;
#include <stdio.h>
int main()
{
int a = 10, b;
b = (a > 15) ? (a + 1) : (a - 1);
printf("b = %d\n", b);
return 0;
}
비트 연산자
수치에 대해 bit 단위의 연산을 수행하는 연산자.
연산자 |
예 |
기능 |
& (bit AND) |
a & b |
두 bit가 모두 1일 때만 1 |
| (bit OR) |
a | b |
두 bit중 하나라도 1이면 1 |
^ (bit XOR) |
a ^ b |
두 bit가 서로 다를 때만 1 |
~ (bit NOT) |
~a |
1은 0, 0은 1로 치환 |
<< (bit 좌로 이동) |
a << 2 |
2 bit 왼쪽으로 이동 |
>> (bit 우로 이동) |
a >> 2 |
2 bit 오른쪽으로 이동 |
비트 연산의 예
|
|
|
|
|
|
|
|
|
|
x |
-> |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
1 |
y |
-> |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
x & y |
-> |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
x | y |
-> |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
x ^ y |
-> |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
~x |
-> |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
x << 2 |
-> |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
x >> 2 |
-> |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
기타 연산자
연산자 |
기능 |
sizeof() |
지정한 자료형, 수식, 변수가 차지하는 기억공간의 크기(byte)를 구함 |
cast(형변환) |
지정한 자료형을 다른 자료형으로 강제정으로 바꿈 |
& |
주소 연산자로 피 연산자의 주소를 나타냄 |
* |
내용 연산자로 피 연산자의 내용을 가져옴 |
sizeof()
- 형식 : sizeof(자료)
- 기능 : 지정한 자료(자료형, 상수, 변수, 수식)에 대한 기억 장소의 크기를 구함
- 사용 예 : sizeof(int)
#include <stdio.h>
int main()
{
float a = 3.14;
printf("sizeof data type int : %d byte\n", sizeof(int));
printf("sizeof a, type of float : %d byte\n", sizeof(a));
// printf("b = %d", b);
return 0;
}
cast()
- 형식 : (형명칭) 자료;
- 기능 : 이미 지정된 자료의 자료형을 강제적으로 다른 자료형으로 변환한다.
- 사용 예 : (float) i / j
#include <stdio.h>
int main()
{
int a = 3, b = 4;
double c;
c = (double)a / b;
printf("result : %f\n", c);
return 0;
}
연산자 우선 순위
연산자 명 |
연산자 |
결합방향 |
우선순위 |
괄호, 구조체, 공용체 연산자 |
() [] -> |
좌 -> 우 |
높음 |
단항 연산자 |
! ~ ++ -- & * sizeof() cast |
우 -> 좌 |
|
승, 제 (이항 연산자) |
* / % |
좌 -> 우 |
|
가, 감 (이항 연산자) |
+ - |
좌 -> 우 |
|
비트 이동 (이항 연산자) |
<< >> |
좌 -> 우 |
|
대 소 비교 (이항 연산자) |
< <= > >= |
좌 -> 우 |
|
등가 판정 (이항 연산자) |
== != |
좌 -> 우 |
|
bit AND (이항 연산자) |
& |
좌 -> 우 |
|
bit XOR(이항 연산자) |
^ |
좌 -> 우 |
|
bit OR(이항 연산자) |
| |
좌 -> 우 |
|
논리 AND (이항 연산자) |
&& |
좌 -> 우 |
|
논리 OR(이항 연산자) |
|| |
좌 -> 우 |
|
조건 연산자 |
?: |
우 -> 좌 |
|
대입 연산자 |
= += *= ... &= |
우 -> 좌 |
|
#include <stdio.h>
int main()
{
int a, b, c;
a = 10;
b = 20;
c = 30;
printf("a + b * c = %d\n", a + b * c);
printf("a = b += 2 * c => a = %d\n", a = b += 2 * c);
printf("a = ( b > c ) ? b : c => a = %d\n", a = (b > c) ? b : c);
printf("a / b * c = %d\n", a / b * c);
printf("a *= b = c + 5 => a = %d\n", a *= b = c + 5);
return 0;
}