[C언어] 7. 연산식과 연산자
이번에는 C언어의 연산식과 연산자에 대해 알아보자.
연산식과 연산자
연산식과 연산자 용어정리
1) 용어정리
3 + 4
//3, 4 : 피연산자
//+ : 연산자
//3 + 4 : 연산식, 표현식, 수식
//결과값 7
연산식(expression) 👉 변수 / 다양한 리터럴 상수 / 함수의 호출로 구성되는 표현식, 항상 하나의 결과값을 가짐
연산값 👉 연산식의 결과값
연산자(operator) 👉 이미 정의된 연산을 수행하는 문자(문자조합) 기호
피연산자(operand) 👉 연산에 참여하는 변수나 상수, 평가하여 항상 하나의결과값을 가짐
2) 연산자
연산에 참여하는 피연산자의 갯수에 따라 | 연산자의 위치에 따라 |
---|---|
단항(단일항; unary) 연산자 : + - => 부호 | 전위(prefix) 연산자 : ++a |
이항(binary) 연산자 : + - * / => 사칙연산 | 후위(posfix) 연산자 : a++ |
삼항(teranry) 연산자 : 조건연산자 ? : |
연산자의 종류
산술연산자와 부호연산자
1) 산술연산자
연산자 | 의미 | 참고 |
+ | 더하기(addiction) | 피연산자 정수형, 실수형 |
- | 빼기(subtraction) | 피연산자 정수형, 실수형 |
* | 곱하기(multiplication) | 피연산자 정수형, 실수형 |
/ | 나누기(division) | ▫️ 정수 % 정수 => 소수부분을 버린 정수 ▫️ 실수%정수 => 소수 |
% | 나머지(remainder, modulus) | 피연산자 정수(실수면 오류) |
2) 부호연산자
+
-
: 피연산자의 부호를 나타내는 연산자
(축약)대입연산자와 증감연산자
1) 대입연산자(assignment operator
- 연산자 오른쪽 결과값을 왼쪽 변수에 저장하는 연산자
L-value
=R-value
(L-value <- R-value)
2) 축약대입연산자
+=
-=
*=
/=
%=
a += b;
//a = a + b;
3) 증감연산자
전위(prefix) | 후위(postfix) | |
---|---|---|
증가(++) | ++a | a++ |
감소(- -) | - -a | a- - |
- 전위연산자
- 후위연산자
관계연산자
1) 관계연산자
- 두 연산자의 크기를 비교하기 위한 연산자
- 관계연산자자의 연산값:
참이면 0
거짓이면 1
- 피연산자 : 정수형, 실수형, 문자형(아스키코드)
연산자 | 연산식 | 의미 |
---|---|---|
> | x>y | x가 y보다 큰가? |
>= | x>=y | x가 y보다 크거나 같은가? |
< | x<y | x가 y보다 작은가? |
<= | x<=y | x가 y보다 작거나 같은가? |
!= | x!=y | x와 y가 다른가? |
== | x==y | x와 y가 같은가? |
논리연산자
1) 논리연산자
- and :
&&
👉 모두 참(!=0)이어야 결과가 참(1) - or :
||
👉 하나만 참(!=0)이어도 결과가 참(1) - not :
!=
👉 거짓(0)이면 참(1) 반환, 참(!=0)이면 거짓(0) 반환
2) 참과 거짓
- 참: 거짓이 아니면 참
- 거짓:
0
0.0
\0
3)단축 평가
- 단축평가란(short circuit evaluation)? 왼쪽 피연산자만으로 논리연산 결과가 결정된다면 오른쪽 피연산자는 평가하지 않는 것
int sale = (amount >= 10000) && (coupons++ >= 10);
//amount < 10000 일 경우,
//(coupons++ >= 10)는 판단하지 않고 바로 sale = 0 대입
조건연산자
1) 조건연산자란? 👉 조건에 따라 주어진 피연산자가 결과값이 되는 삼항연산자
조건 ? 참일때 : 거짓일때
char ch = (a > b) ? 'a' : 'b'
비트연산자
1) 비트연산자
- C언어는
정수의 비트 중심(bitwise) 연산자
를 제공함 - 비트연산자의 종류 : 비트 논리 연산자, 비트 이동연산자
2-1) 비트논리 연산자
- 피연산자 정수 값을 비트 단위로 논리연산을 수행하는 연산자
- 종류: 전위단항연산자(
~
), 이항연산자(%
|
^
) - 피연산자의 자료형 :
char
int
long
long long
- 각 피연산자를
int
형으로 변환하여 연산, 결과int
연산자 | 이름 | 예시 | 의미 |
---|---|---|---|
& | bit AND(AND 연산자) | op1 & op2 | 비트가 모두 1이면 1 |
| | bit OR(OR 연산자) | op1 | op2 | 비트가 하나만 1이면 1 |
^ | bit XOR(배타적 OR 연산자) | op1 ^ op2 | 비트가 서로 다르면 1 |
~ | bit complement(NOT/보수 연산자) | ~op1 | 비트가 0이면 1, 1이면 0 |
2-2) 비트 이동연산자
- 연산자의 방향인 왼쪽이나 오른쪽으로, 비트단위로 줄줄이 이동시키는 연산자
연산자 | 이름 | 예시 | 의미 |
---|---|---|---|
>> | bit shift RIGHT | op1 >> op2 | 가장 왼쪽 비트인 부호비트를 원래의 부호 비트로 채워서 이동 |
<< | bit shift LEFT | op1 << op2 | 가장 오른쪽 비트를 모두 0으로 채움 |
형변환 연산자
1) 형변환이란(type cast, type conversion) 👉 필요에 따라 자료의 표현방식을 바꾸는 것
- 자료형 크기의 범주 변화에 따른 구분
- 올림변환: 작은 범주의 자료형에서 큰 범주인 자료형으로의 형변환 방식
- 내림변환: 큰 범주의 자료형에서 보다 작은 범주인 자료형으로의 형변환 방식
- 자료형 변환 구분 방식
- 명시적(강제) 형변환: 소스에서 직접 형변환 연산자를 사용하는 방식
- 묵시적(자동) 형변환: 컴파일러가 알아서 자동으로 수행하는 방식
1-1) 올림변환과 내림변환
- 올림변환(promotion)
- 형 넓히기
- 산술연산에서 피연산자의 자료형이 다른 경우 자동 올림변환
- 정보의 손실이 없으므로 컴파일러가 올림변환 => 묵시적 형변환
- 내림변환
- 대입연산에서 저장되는 변수의 자료형과, 저장 값의 자료형이 다르면 자동 내림변환
- 묵시적 내림변환의 경우 정보의 손실이 발생할 수 있어 경고 발생
1-2) 명시적 형변환과 묵시적 형변환
- 묵시적 형변환(implicit type conversion): 컴파일러가 알아서 자동으로 수행하는 방식
- 올림변환: 정보의 손실이 없음
- 내림변환: 정보의 손실이 발생할 수 있어 경고 발생, 명시적 형변환이 필요
- 명시적 형변환(exlicit type conversion): 형변환 연산자(type cast)를 사용해 뒤에 나오는 피연산자의 값을 괄호에서 지정한 자료형으로 변환하는 방식
- 예시:
int i = (int)double_value;
- 내림변환이나 올림변환 모두 이용가능
- 예시:
sizeof연산자
1) sizeof연산자란?
- 연산값, 변수, 자료형의 저장장소의 크기를 구하는 연산자
- 결과값: 바이트 단위의 정수
sizeof 상수나 변수
sizeof (상수나 변수)
sizeof 연산식, 연산값
sizeof (연산식, 연산값)
sizeof (자료형)
콤마연산자
1) 콤마연산자 ,
- 왼쪽과 오른쪽 연산식을 각각 순차적으로 계산하고, 결과값은 가장 오른쪽에서 수행한 연산의 결과
3 + 4, 5 - 10 //-5
3 + 4, 5 - 10, 2 * 3 //6
//연산자 우선순위: 대입연산자 > 콤마연산자
x = 3 + 4, 2 * 3 //x = 7, 6
연산자 우선순위와 결합성
연산자 우선순위 규칙
- 규칙 1)
괄호우선규칙
: 괄호가 있으면 먼저 계산 - 규칙 2)
연산자 우선규칙
: 연산자의 우선순위에 따라 계산 - 규칙 3)
연산자 결합성
: 괄호가 없고, 같은 우선순위면 일반적으로 왼쪽에서 오른쪽으로 연산, 일부는 오른쪽에서 왼쪽으로 => 계산방향
C언어 연산자 우선순위
우선순위 | 연산자 | 설명 | 분류 | 결합성(계산방향) |
---|---|---|---|---|
1 | () [] . -> a++ a-- | 함수호출 인덱스 필드(유니온) 멤버 지정 필드(유니온)포인터 멤버 지정 후위증가, 후위감소 | 단항 | -> |
2 | ++a --a !~ sizeof -+ & * | 전위증가, 전위감소 논리 NOT, 비트 NOT(보수) 변수, 자료형, 상수의 바이트 단위 크기 음수 부호, 양수 부호 주소 간접, 역참조 | 단항 | <- |
3 | (형변환) | 형변환 | 단항 | <- |
4 | * / % | 곱하기 나누기 나머지 | 산술 | -> |
5 | + - | 더하기 빼기 | 산술 | -> |
6 | >> << | 비트 이동 | 이동 | -> |
7 | < > <= >= | 대소비교 | 관계 | -> |
8 | == != | 동등비교 | 관계 | -> |
9 | & | 비트 AND 또는 논리 AND | 비트 | -> |
10 | ^ | 비트 XOR 또는 XOR | 비트 | -> |
11 | | | 비트 OR 또는 논리 OR | 비트 | -> |
12 | && | 논리 AND(단락계산) | 논리 | -> |
13 | || | 논리 OR(단락계산) | 논리 | -> |
14 | ?: | 조건 | 조건 | <- |
15 | == += -= *= /= %= <<= >>= &= |= ^= | 대입 | 대입 | <- |
16 | , | 콤마 | 콤마 | -> |