종류 | 연산자 |
산술 연산자 | x+y x-y x*y x/y x%y +x -x |
증감 연산자 | x** **x x-- --y |
관계 연산자 | x>y x<y x>=y x<=y x==y x!=y |
논리 연산자 | x&&y x||y !x |
비트 연산자 | x&y x|y x^y ~x x<<y x>>y |
대입 연산자 | x=y x+=y x-=y x*=y x/=y x%=y x&=y x|=y x^=y x>>=y x<<=y |
멤버 접근 연산자 | *x &x x[y] x.y x->y |
그 밖의 연산자 | x?y:z x,y sizeof(x) (type)x |
- 증감 연산자 : 증가 (+1), 감소 (-1) 연산
→ 상수나 수식에는 사용할 수 없음
Ex.
a = a + 1 → a++ / ++a
a = a - 1 → a-- / --a
- prefix, 전치형(전위형)
a = 5;
printf("%d", ++a);
1. 증가 ++a : a의 값이 6으로 증가됨
2. 출력 printf() : a 값이 출력됨
→ a가 6으로 변한 후 값이 출력됨
- postfix, 후치형(후위형)
a = 5;
printf("%d", a++);
1. 출력 printf() : a의 값이 5로 출력됨
2. 증가 a++ : a의 값이 6으로 증가됨
→ a가 출력된 후 6으로 변함
- 산술 연산자 : 기본 사칙연산
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
int x, y;
scanf("%d%d", &x, &y);
printf("합 %d\n", x + y);
printf("차 %d\n", x - y);
printf("곱 %d\n", x * y);
printf("몫 %d\n", x / y);
printf("나머지 %d\n", x % y);
return 0;
}
Ex.
4 / 5 = 0
→ 정수 / 정수는 몫을 정수로 구함
결과값으로 0.8을 출력하고 싶다면?
정수 / 정수 결과는 정수이므로 둘 중 하나를 실수로 변경하자!
방법 1. 정수 4를 실수 4.0으로 바꿔 연산
4.0 / 5 => 실수 / 정수 => 실수 / 실수 => 실수
묵시적(암묵적) 형변환 : 컴퓨터가 자동으로 형변환 함
→ 정수를 자동으로 실수로 형변환 함
방법 2. 형변환 연산자 활용
정수 / 정수를 실수 / 정수로 바꿔보자!
int x=4, y=5;
(double) x / y => 실수 / 정수 => 실수 / 실수 => 실수
명시적 형변환 : 형변환 연산자(cast)로 일시적 형변환 함
★ 형변환(cast) ★
: 피연산자의 자료형이 서로 다른 경우 하나의 자료형으로 변환되어 연산이 수행됨
- 묵시적(암묵적) 형변환
▶ 연산 : 큰 자료형을 따라감
정수 정수 => 정수 short + int => int
실수 실수 => 실수 float + double => double
정수 실수 => 실수 int + double => double
▶ 대입
double x = 55;
: 정수 55가 실수(double형)로 변함
▶ 정수의 (정수형) 승격
short a = 2;
short b = 3;
a*b → short * short
→ 정수 (4 byte로 형변환)
: 정수형으로 사용 가능한 short(2 byte), char(1 byte) 연산 과정
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
short a = 2, b = 3;
printf("%d %d %d\n", sizeof(a), sizeof(b), sizeof(a * b));
return 0;
}
- 명시적 형변환
▶ (자료형) 변수
▶ 일시적인 형변환
★ 자료의 변환을 연산자가 진행하므로 명시적 형변환시 (int) 3.4와 같이 연산자에 괄호를 붙임 ★
- 대입 연산자(할당 연산자, 치환 연산자) : 변수 대입 연산
→ 좌변에 있는 변수에 우변의 값을 저장
→ 매크로 상수나 const 변수에는 대입할 수 없음
l-value : 대입 연산자의 왼쪽을 의미함
→ 값을 변경할 수 있는 요소, 즉 변수를 의미
Ex.
int width;
width = 100; (O)
100 = width; (X)
- 복합 대입 연산자 ( 축약 대입 연산자 )
: 산술/비트 연산자와 대입 연산자를 결합
Ex.
a = a+2
a += 2
- 관계 연산자 : 크기 비교 연산
→ C언어에는 부울값 데이터를 취급하지 않음
: 참은 정수 1, 거짓은 정수 0으로 저장
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void) {
printf("%d\n", 2 > 3); // 거짓은 0, 참은 1
printf("%d\n", 2 + 3);
return 0;
}
→ 관계 연산식을 조합할 때는 논리 연산자를 함께 사용함
90 <= score <= 100 (X)
90 <= scroe && score <= 100 (O)
→ expr != 0과 expr는 같은 의미임
if (expr != 0)
do something;
: expr이 0이 아닌가? 그렇다면 do something
if (expr)
do something;
: expr이 참(0이 아닌 값)인가? 그렇다면 do something
- 논리 연산자 : 표현식 연결 연산
→ 피연산자가 0이 아니면 참으로 간주함
논리 연산자 | 부울 대수 | 의미 |
x && y | 논리 AND | x와 y가 둘 다 0이 아니면 1, 그렇지 않으면 0 |
x || y | 논리 OR | x와 y 중 하나라도 0이 아니면 1, x와 y가 둘 다 0이면 0 |
!x | 논리 NOT | x가 0이면 1, x가 0이 아니면 0 |
usage >= 1000 && usage <= 2000
→ (usage >= 1000) && (usage <= 200)
→ &&, || 연산보다 관계 연산을 먼저 수행함
! expr == value
→ (! expr) == value
→ ! 연산은 관계 연산보다 먼저 수행됨
expr1 || expr2 && expr3
→ expr1 || (expr2 && expr3)
→ && 연산이 || 연산보다 먼저 수행됨
if (expr == 0)
do something;
→ if (! expr)
do something;
→ 0인지 비교하는 대신 ! 연산자 사용
- 조건 연산자 : 조건에 맞는 표현식 실행 연산 → 삼항 연산자
- 조건식? 항1 : 항2
- 변수 = 조건식 ? 참 : 거짓
- 조건식? printf(참) : printf(거짓)
- printf("서식", 조건식? 참식 : 거짓식) → 참식과 거짓식이 같은 자료형일 경우만 사용
: 조건식이 참(1)이면 참식, 거짓(0)이면 거짓식을 출력
- 비트 연산자 : 저장된 데이터를 비트 단위로 연산
→ 피연산자로 정수형만 사용할 수 있음
구분 | 비트 연산자 | 의미 |
비트 논리 연산자 | x & y | x와 y의 각 비트 단위로 논리 AND 연산 |
x | y | X와 Y의 각 비트 단위로 논리 OR 연산 | |
x ^ y | X와 Y의 각 비트 단위로 논리 XOR 연산 | |
~ x | X의 각 비트 단위로 논리 NOT 연산 | |
비트 이동 연산자 | x << y | X의 각 비트를 Y만큼 왼쪽으로 이동 |
x >> y | X의 각 비트를 Y만큼 오른쪽으로 이동 |
'Language > C' 카테고리의 다른 글
[ C ] [ 연산자 연습 문제 ] 정수부 / 소수부 나누기 프로그램 (0) | 2021.10.05 |
---|---|
[ C ] [ 연산자 연습 문제 ] 단위 변경 프로그램 (0) | 2021.10.05 |
[ C ] [ 변수 연습 문제 ] 성별 출력 프로그램 (0) | 2021.09.16 |
[ C ] [ 변수 연습 문제 ] 아스키코드값 출력하기 (0) | 2021.09.16 |
[ C ] [ scanf() 연습 문제 ] 섭씨 온도 → 화씨 온도 변환 프로그램 (0) | 2021.09.13 |