연산자 종류
C언어에는 아래와 같은 다양한 연산자들이 존재한다.
연산자 분류 | 연산자 |
산술 연산자 | + - * / % |
대입 연산자 | = += -= *= /= %= |
부호 연산자 | + - |
증감 연산자 | ++ -- |
관계 연산자 | == != < > <= >= |
논리 연산자 | || && ! |
비트 연산자 | ! & >> << ~ |
산술 연산자
다른 프로그래밍 언어와 동일하게 덧셈(+), 뺄셈 (-), 곱셈(*), 나눗셈(/), 나머지(%) 연산을 수행한다
대입 연산자
다른 프로그래밍 언어와 동일하게 연산자 오른쪽의 값을 왼쪽에 대입(=) 한다.
+=, -=, *=, /=, %= 연산자는 연산자 왼쪽의 값을 오른쪽 값과 +, -, *, /, %연산하여 다시 왼쪽의 값에 대입한다.
부호 연산자
부호 연산자는 + 부호, - 부호를 붙여주는 연산자이다. 수학에서의 +, -와 동일
부호연산자는 숫자와 붙어있다는 점을 유의! e.g. 7+ -3
증감 연산자
증감(증가/감소) 연산자를 사용하면 이항 연산자들의 연산을 단항 연산자로 줄여 표기할 수 있다.
종류에는 ++와 --의 두 가지가 존재하지만, 연산자가 피연산자 앞/뒤에 올 때의 연산결과가 다르므로 총 4가지의 연산 종류가 존재한다.
연산자 | 의미 |
++a | a의 값을 1 증가시킨 후 연산을 진행 |
a++ | 연산을 진행한 후 a의 값을 1 증가시킨다 |
--a | a의 값을 1 감소시킨 후 연산을 진행 |
a-- | 연산을 진행한 후 a의 값을 1 감소시킨다 |
연산자가 먼저 오는 경우는 (++a, --a) 연산자의 우선순위가 더 높다고 생각하면 이해하기 쉽다. 즉, 먼저 a값을 1을 증감시키고 이 값으로 다음 연산을 수행한다. 반면 연산자가 뒤에 오는 경우는 연산을 먼저 진행하고 그 다음에서야 a의 값을 증감한다.
관계 연산자
관계 연산자는 두 개의 피연산자로 관계를 비교하는 이항 연산자이다.
피연산자 두 값이 같은지(==), 다른지( !=), 왼쪽 값이 오른쪽 보다 작은지(<), 큰지(>), 작거나 같은지(<=), 크거나 같은지(>=) 를 비교하여 true(내부적으로는 1) 또는 false (내부적으로는 0)를 리턴한다.
논리 연산자
논리연산자 ||는 OR(하나라도 참이면 참), &&는 AND(둘다 참이어야 참) 연산을 하고, !는 결과를 반대로 만든다
비트 연산자
비트를 대상으로 하는 연산자. 이제는 과거에 비해 메모리양이 늘어나서 비트 연산을 수행하는 경우가 자주있지는 않지만.. (하지만 비트연산으로 비트마스킹을 하면 알고리즘 풀 때 유용한 스킬이 되곤 한다) 간단하게 짚고 넘어가자.
종류 | 의미 | 예시 (a= 10001000, b=10011111) |
~ | NOT. 비트 반전 | ~a = 01110111, ~b = 01100000 |
^ | XOR. 비트가 다를 때만 1 | a^b = 00010111 |
& | AND. 비트가 모두 1일때만 1 | a&b = 10001000 |
| | OR. 비트가 모두 0일 때만 0 | a|b = 10011111 |
<< | 지정 수 만큼 비트를 왼쪽으로 이동하고 남은 자리는 0으로 채움 | a<<2 = 00100000, b<<2 = 01111100 |
>> | 지정 수 만큼 비트를 오른쪽으로 이동하고 남은 자리는 0으로 채움 | a>>2 = 00100010, b>>2 = 00100100 |
연산 규칙 - 연산의 우선순위와 결합 순서
여러 연산자들 함께 사용할때 어떤 연산자부터 계산이 되는지 알려면 연산자 우선순위를 알면 된다.
아래 표에서 위쪽에 있을 수록 연산자의 우선순위가 높다. 실수를 피하기 위해서는 항상 괄호를 쓰는 습관을 들이면 좋다.
자료형 변환 - 자동 형 변환과 명시적 형 변환
자료형이 다른 변수끼리는 '형 변환'을 통해 연산할 수 있다. 형 변환에는 자동 형 변환과, 명시적 형 변환이 존재한다.
자동 형 변환: 서로 다른 두 자료형에 대해 연산 시 자동으로 발생하는 형 변환
#include <stdio.h>
int main(void)
{
int a = 10;
int b;
double d = 3.14;
b= a+d; // a가 d와 더해지기 위해 실수로 형 변환되고, a+d 값은 b에 저장되기 위해 정수로 형 변환된다.
printf("%d", b); // 13 출력
return 0;
}
위 코드에서는 두 번의 자동 형 변환이 일어난다.
(1) 첫 번째 형 변환은 a+d 에서 발생한다. a와 d는 서로 다른 자료형이기 때문에 연산이 일어날 수 없기 때문에 정수형 a가 실수형 a로 자동 변환된다. 이제 정수 10이 실수 10으로 바뀌었다.
(2) 두 번째 자동 형 변환은 a+d을 b에 대입할 때 발생한다. a와 d를 더하면 13.14 이지만, 이 값을 대입할 b는 정수형 변수이기 때문에 13.14 가 저장될 수 없다. 따라서 이 값은 자동으로 정수형 데이터로 변환되어 13이 된다.
명시적 형 변환: 사용자가 직접 명시하여 형을 변환하는 것을 의미
#include <stdio.h>
int main(void)
{
int a = 10;
int b = 3;
double f = a/b;
printf("%f", f); // 3.000000 출력
return 0;
}
10/3은 산술적으로 3.333... 이다. 그런데 위의 코드의 printf 문은 3.333333이 아닌, 3.000000을 출력한다. 왜냐하면 🚨 산술 연산 결과의 자료형은 피연산자의 자료형과 일치 🚨하기 때문이다. a/b를 수행할 때 a와 b가 정수형 자료이기 때문에 결과도 정수형이 되기 때문에 소수부는 모두 사라진 것이다.
이 경우, a/b 부분이 피연산자의 자료형과 일치하지 않도록, 명시적으로 실수형임을 명시해준다면 3.333333 과 같은 결과를 얻을 수 있다. 방법은 간단하다. a/b 앞에 (double) 로 자료형을 명시해주는 것이다. (아래 코드 참조)
#include <stdio.h>
int main(void)
{
int a = 10;
int b = 3;
double f = (double)a/b;
printf("%f", f); // 3.333333 출력
return 0;
}
Reference
1. C Programming : A Modern Approach, 2/E K. N. King | W. W. Norton & Company
'C' 카테고리의 다른 글
[C] 포인터 | 포인터란, 포인터 변수의 선언/초기화/호출, &연산자와 *연산자, 포인터의 연산, 포인터에 자료형이 필요한 이유 (0) | 2022.10.22 |
---|---|
[C] 반복문 | while문, do-while문, for 문, break, continue (0) | 2022.10.21 |
[C] 조건문 | if문 & switch문 (0) | 2022.10.21 |
[C] 변수 | 변수란, 변수 선언, 자료형, 데이터 입출력 (2) | 2022.10.21 |
[C] 프로그램 개발과정 / C언어란 / 기본 소스코드 분석 (0) | 2022.10.21 |
댓글