C언어에서 산술 연산자는 사칙연산과 나머지(% )구하기를 말합니다. 나눗셈의 경우 정수에서 정수를 나눠도 실수인 답이 있으므로 자료형 선택에 유의해야 합니다.
산술 연산자는 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/) 그리고 나머지(%)를 말합니다. 나머지란 나눗셈에서 몫을 제외한 나머지를 의미합니다.
+ | x + y | 덧셈 |
- | x - y | 뺄셈 |
* | x * y | 곱셈 |
/ | x / y | 나눗셈 |
% | x % y | 나머지 |
자료형이 정수형, 실수형이냐에 따라서 연산 결과가 달라질 수 있습니다. 정수는 -3, -2, -1과 같은 음의 정수, 0 그리고 +1, +2, +3과 같은 양의 정수를 말합니다.
실수는 정수 보다 큰 범위의 수입니다. 허수를 제외한 유한 소수(0.3), 유리수(1/3), 무리수(√2), 순환 소수(0.3333...) 등이 모두 포함된 범위입니다.
덧셈 연산자
C언어 덧셈은 + 기호를 사용해서 연산합니다.
#include<stdio.h> void main() { int x = 2; //정수 자료형(int) 조건으로 변수 x를 생성하고 정수 2를 대입했습니다. int y = 3; //정수 자료형(int) 조건으로 변수 y를 생성하고 정수 3을 대입했습니다. int z; //정수 자료형(int) 조건으로 변수 z를 생성했지만, 변수값은 지정하지 않았습니다. z = x + y; //변수 z에 변수 x와 변수 y의 값을 더해서 저장합니다. printf("%d", z); //정수형 자료형(%d)으로 변수 z에 저장된 변수값(x + y)을 출력합니다. }결과
5소수와 같은 실수 범위를 더할 경우 변수 선언시 자료형을 실수(float)로 변환하고, 출력시(printf) 자료형도 실수(%f)로 변환해야 합니다. 또한 실수의 경우 출력시 기본 소수 여섯자릿수까지 출력됩니다. 적절한 자릿수 조절이 필요합니다.
결과
4.5뺄셈 연산자
C언어 뺄셈은 - 기호를 사용해서 연산합니다.
#include<stdio.h> void main() { int x = 2; //정수 자료형(int) 조건으로 변수 x를 생성하고 정수 2를 대입했습니다. int y = 3; //정수 자료형(int) 조건으로 변수 y를 생성하고 정수 3을 대입했습니다. int z; //정수 자료형(int) 조건으로 변수 z를 생성했지만, 변수값은 지정하지 않았습니다. z = x - y; //변수 z에 변수 x에서 변수 y를 뺀 값을 저장합니다. printf("%d", z); //정수형 자료형(%d)으로 변수 z에 저장된 변수값(x - y)을 출력합니다. }결과
-1곱셈 연산자
C언어 곱셈은 * 기호를 사용해서 연산합니다.
#include<stdio.h> void main() { int x = 3; int y = 4; int z; z = x * y; printf("%d", z); }결과
12나눗셈 연산자
C언어 나눗셈에서는 / 기호를 사용합니다. 나눗셈의 경우 정수 / 정수 = 실수 형태인 경우가 있을 수 있습니다. 그럴 경우 자료형을 실수형으로 적절히 변환해야 합니다. 예를 들어 5 / 2 = 2.5 수식에서 5와 2는 정수이지만 결과인 2.5는 소수이므로 실수입니다. 아래와 같이 예제를 짤 경우 답은 2.5가 아닌 2로 정수 형태로 출력됩니다. 이 경우는 나눗셈이 아니라 몫을 구한 경우라고 볼 수 있습니다.
#include<stdio.h> void main() { int x = 5; //정수 자료형(int)으로 변수 x를 지정하고, 변수값 5를 대입합니다. int y = 2; //정수 자료형(int)으로 변수 y를 지정하고, 변수값 2를 대입합니다. int z; //정수 자료형(int)으로 변수 z를 지정하고, 변수값은 비워둡니다. z = x / y; //변수 z에 변수 x를 변수 y로 나눈 값을 저장합니다. printf("%d", z); //정수 자료형(%d)으로 변수 z에 삽입된 변수값(x / y)을 출력합니다. }결과
몫이 아닌 나눗셈의 정확한 연산을 구해야 할 경우 변수 선언시 자료형을 실수형(float)로 변경해야 하고, 출력 함수에서도 자료형을 실수형(%f)로 변경해줘야 합니다.
#include<stdio.h> void main() { float x = 5; //실수 자료형(float)으로 변수 x를 지정하고, 변수값 5를 대입합니다. float y = 2; //실수 자료형(float)으로 변수 y를 지정하고, 변수값 2를 대입합니다. float z; //실수 자료형(float)으로 변수 z를 지정하고, 변수값은 비워둡니다. z = x / y; //변수 z에 변수 x를 변수 y로 나눈 값을 저장합니다. printf("%2.1f", z); //실수 자료형(%f)으로 변수 z에 삽입된 변수값(x / y)을 출력합니다. 자릿수는 2.1로 숫자 2는 총 자리수를 의미하며 소수 자릿수 0.1은 소수 한 자리를 의미합니다. }결과
2.5나머지 연산자
C언어 나머지 연산은 % 기호를 사용합니다. 5에서 3을 나누면 몫은 1이고 나머지는 2입니다.
#include<stdio.h> void main() { int x = 5; int y = 3; int z; z = x % y; printf("%d", z); }결과
2나머지 연산자는 홀수/짝수를 구분할 때 자주 사용됩니다.
수학에서 35 + 1 * 2의 결과는 무엇일까요? 이 식에서는 덧셈 다음에 곱셈으로 나와있지만 곱셈이 덧셈보다 우선순위가 높으므로 72가 아니라 37이 됩니다. 즉 1 * 2를 먼저 계산해서 2가 나오고, 앞의 35와 더해서 37이 됩니다. 만약 35 + 1를 먼저 계산하려면 (35 + 1) * 2처럼 괄호로 묶어주어야 합니다.
마찬가지로 C 언어도 곱셈이 덧셈보다 우선순위가 높고, 다양한 연산자들끼리 우선순위가 정해져 있습니다.
▼ 표 25‑1 C 언어 연산자 우선순위1 | x++ x-- ( ) [ ] . -> (자료형){값} | 증가 연산자(뒤, 후위) 감소 연산자(뒤, 후위) 함수 호출 배열 첨자 구조체/공용체 멤버 접근 포인터로 구조체/공용체 멤버 접근 복합 리터럴 | → |
2 | ++x --x +x -x ! ~ (자료형) *x &x sizeof | 증가 연산자(앞, 전위) 감소 연산자(앞, 전위) 단항 덧셈(양의 부호) 단항 뺄셈(음의 부호) 논리 NOT 비트 NOT 자료형 캐스팅(자료형 변환) 포인터 x 역참조 x의 주소 자료형의 크기 | ← |
3 | * / % | 곱셈 나눗셈 나머지 | → |
4 | + - | 덧셈 뺄셈 | → |
5 | << >> | 비트를 왼쪽으로 시프트 비트를 오른쪽으로 시프트 | → |
6 | < <= > >= | 작음 작거나 같음 큼 크거나 같음 | → |
7 | == != | 같음 다름 | → |
8 | & | 비트 AND | → |
9 | ^ | 비트 XOR | → |
10 | | | 비트 OR | → |
11 | && | 논리 AND | → |
12 | || | 논리 OR | → |
13 | ? : | 삼항 연산자 | ← |
14 | = += -= *= /= %= <<= >>= &= ^= |= | 할당 덧셈 후 할당 뺄셈 후 할당 곱셈 후 할당 나눗셈 후 할당 나머지 연산 후 할당 비트를 왼쪽으로 시프트한 후 할당 비트를 오른쪽으로 시프트한 후 할당 비트 AND 연산 후 할당 비트 XOR 연산 후 할당 비트 OR 연산 후 할당 | ← |
15 | , | 쉼표(콤마) 연산자 | → |
연산자 우선순위를 모두 외울 필요는 없으며 필요할 때 찾아보면 됩니다. 실무에서는 연산자의 계산 순서를 ( ) (괄호)로 명확하게 나타내는 것을 선호합니다.
보통 남이 만든 코드 중에서 연산자에 괄호를 잘 사용하지 않아 이해하기가 힘들 때나 찾아보면 됩니다.