15.2 변수 하나에서 나머지 연산하기
이번에는 변수 하나에서 나머지 연산을 하는 방법을 알아보겠습니다.
- 변수1 = 변수1 % 값;
다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.
mod_variable.c
#include <stdio.h> int main() { int num1 = 7; num1 = num1 % 2; // num1에서 2를 나눈 뒤 나머지를 구하여 다시 num1에 저장 printf("%d\n", num1); // 1 return 0; }
실행 결과
1
num1 = num1 % 2;는 num1에서 2를 나눈 뒤 나머지를 구하여 다시 num1에 저장합니다. 즉, 계산 결과를 같은 변수에 계속 유지합니다. 단, 0으로 나머지 연산을 하지 않도록 주의합니다.
나머지 연산도 변수를 두 번 입력하지 않도록 나머지를 구한 후 할당 %= 연산자를 제공합니다.
- 변수 %= 값
mod_assign.c
#include <stdio.h> int main() { int num1 = 7; num1 %= 2; // num1에 2를 나눈 뒤 나머지를 구하여 다시 num1에 저장 printf("%d\n", num1); // 1 return 0; }
실행 결과
1
num1 %= 2;는 나머지 연산과 할당 연산을 동시에 처리합니다. 즉, num1 = num1 % 2;의 축약형입니다. 단, 0으로 나머지 연산을 하지 않도록 주의합니다.
참고로 다음과 같이 모두 변수를 사용하여 연산해도 상관없습니다.
int num1 = 7; int num2 = 2; num1 %= num2; num1 = num1 % num2;
참고 | 음수의 나머지 연산
음수를 나머지 연산했을 때 결과는 어떻게 될까요? 결과가 음수가 나올지 양수가 나올지 좀 헷갈립니다.
printf("%d\n", 5 % (-3)); // 2 printf("%d\n", (-5) % 3); // -2 printf("%d\n", (-5) % (-3)); // -2
C99 표준에서 나머지 연산자는 a == (a / b) * b + a % b로 정의하고 있습니다. 따라서 이 식에 앞의 값들을 대입해보면 왜 그런지 알 수 있습니다.
- 5 == 5 / (-3) * (-3) + 5 % (-3)
- 5 == (-1) * (-3) + 2
- 5 == 3 + 2
- -5 == (-5) / 3 * 3 + (-5) % 3
- -5 == (-1) * 3 + (-2)
- -5 == (-3) + (-2)
- -5 == (-5) / (-3) * (-3) + (-5) % (-3)
- -5 == 1 * (-3) + (-2)
- -5 == (-3) + (-2)
결론적으로 a % b를 연산하면 결과는 a의 부호를 따릅니다(b의 부호는 무시).