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의 부호는 무시).