본문 바로가기

C언어

[C언어] 계산하기 (산술 연산자, 산술 변환, 대입 연산자, 증감 연산자)

안녕하세요, 엔지니어 블로그의 글랜입니다.

오늘은 C언어-계산하기를 진행해보겠습니다.

 

1-1. 산술 연산자 - 코드 작성 및 프로그램 실행 결과

 

[그림1] 산술 연산자 - 코드 작성

상기 그림과 같이 a = 10, b = 6로 선언한뒤, 빌드 및 프로그램 실행을 진행해줍니다.

[그림2] 산술 연산자 - 프로그램 실행 결과

그 결과 다음과 같이 나왔네요. 그렇다면 한번 코드 분석을 진행해봅시다.

 

1-2. 산술 연산자 - 코드 분석

 

printf("a + b 는 : %d \n", a + b); // 결과는 16
printf("a - b 는 : %d \n", a - b); // 결과는 4
printf("a * b 는 : %d \n", a * b); // 결과는 60

 

상기의 +, -, * 는 일상생활에서 자주 사용하는 산술 연산자들입니다. 합리적으로 a와 b가 각각 10, 6로 선언되었으므로, 합은 16 / 뺄셈은 4 / 곱셈은 60 이라는 것을 잘 알 수 있죠.

 

printf("a / b 는 : %d \n", a / b); // 결과는 1

 

그런데 왜 a 나누기 b는 1일까요? 이유는 정수 데이터이기 때문입니다. 10 나누기 6은 1.66666.... 이지만 정수 부분인 1만 출력되는 것입니다. 따라서 1이 출력되는 것이 맞습니다.

 

printf("a %% b 는 : %d \n", a % b); // 결과는 4

 

마지막으로 % 라는 연산자입니다. +, -, *, / 연산자는 모두 정수, 실수형 데이터에 대해서 연산이 가능한데, %는 오직 정수형 데이터에서만 연산이 가능합니다. 그 이유는 %가 나눈 나머지를 표시하기 때문입니다. 따라서 a(10)와 b(6)를 나누면 4가 남게 됩니다.

추가로, %%로 표시한 이유는 %가 %d, %f와 같이 사용되기 때문에 %만을 출력하기 위함입니다.

 

2-1. 산술 변환 - 코드 작성 및 프로그램 실행 결과

 

[그림3] 산술 변환 - 코드 작성

상기 그림과 같이 코드를 작성해준뒤, 빌드 및 프로그램 실행을 해줍시다.

 

[그림4] 산술 변환 - 프로그램 실행 결과

a 나누기 b 결과는 이상하게 나오고 c 나누기 d, d 나누기 c 결과는 정상적으로 나왔네요.

왜 그럴까요?

 

2-2. 산술 변환 - 코드 분석

int a, b;
printf("a / b 는 : %f \n", a / b); // 결과는 0

 

[정수형 변수] [연산] [정수형 변수] 의 결과는 항상 [정수]로 유지됩니다. 따라서 실수형 데이터를 출력하는 %f를 정수형 값 출력에 사용하게 되면 위와 같이 이상한 값(0.00000)이 나타나게 되는겁니다.

 

int c;
double d;
printf("c / d 는 : %f \n", c / d); // 결과 1.66667
printf("d / c 는 : %f \n", d / c); // 결과 0.60000

 

c는 정수형 변수, d는 실수형 변수입니다. 그런데 이들에 대해 연산을 수행한 결과를 실수형으로 출력했는데 정상적으로 동작했네요. 그 이유는 컴파일러가 산술 변환을 수행했기 때문입니다. 자료형이 다른 두 변수를 연산할 경우, 숫자의 범위가 큰 자료형으로 변환을 하게 됩니다. 따라서 숫자의 범위가 큰 d에 맞게 실수형 변수로 c가 산술 변환이 된거죠.

오히려 %d를 사용했다면 오류가 생기게 되었겠네요.

 

3-1. 대입연산자 - 코드 작성 및 프로그램 실행 결과

 

[그림5] 대입연산자 - 코드 작성

상기 그림과 같이 코드를 작성해준뒤, 빌드 및 프로그램 실행을 진행합니다.

 

[그림6] 대입연산자 - 프로그램 실행 결과

그 결과, 모두 4라는 값이 나왔네요. 코드를 한번 살펴봅시다.

 

3-2. 대입연산자 - 코드 분석

a = a + 1;

 

아주 기초적으로 1을 더하는 방법입니다. a는 3이였으니, +1을 한 결과 4가 정상적으로 출력되었죠.

 

b += 1;

 

약간은 생소한 += 연산입니다. 이러한 연산을 복합 대입연산 이라고 하며, b = b + 1 라는 의미와 같습니다. 이렇게 쓰는 이유는 b = b + 1 전부를 쓰기 귀찮아서 입니다.

 

b += x; // b = b + x; 와 같은 의미
b -= x; // b = b - x; 와 같은 의미
b *= x; // b = b * x; 와 같은 의미
b /= x; // b = b / x; 와 같은 의미

 

이러한 복합 대입연산은 상기와 같이 다른 연산자에도 적용될 수 있습니다.

 

++c ; // 증감 연산자 - 전위형(prefix)
d++ ; // 증감 연산자 - 후위형(postfix)

위와 같은 연산자(++)를 증감 연산자라고 합니다. 전위형의 경우 먼저 1을 더해준 후 결과를 돌려주고, 후위형의 경우 결과를 돌려준 후 1를 더해줍니다.

 

증감 연산자에 대해 더 정확하게 알아보기 위해서 하기의 예시를 살펴보겠습니다.

 

4-1. 증감 연산자 - 코드 작성 및 프로그램 실행 결과

 

[그림7] 증감 연산자 - 코드 작성

상기와 같이 코드를 작성해주고요.

 

[그림8] 증감 연산자 - 프로그램 실행 결과

결과가 다르게 나왔네요. 한번 분석해봅시다.

 

4-2. 증감 연산자 - 코드 분석

int a = 3;
printf("++a : %d \n", ++a); // 결과는 4

 

전위형인 ++a는 먼저 1을 더한 후 결과를 반환합니다. 따라서 결과는 4가 나왔습니다.

 

a = 3;
printf("a++ : %d \n", a++);  // 결과는 3
printf("a : %d \n", a); // 결과는 4

 

반면 후위형인 a++는 먼저 a의 값인 3을 반환하여 출력한뒤에 a에 1이 더해집니다. 따라서 그 다음에 나오는 a값이 4가 나오게 되는것이죠.

 

추가로, 위 4개의 연산 중에서 가장 빨리 연산되는 것은 a++과 같은 증감 연산자입니다.