본문 바로가기
📚 STUDY/🔥 C

[4-1] 산술연산자

by 엄지잉 2024. 9. 3.

- 산술연산자 : 덧셈, 뺄셈, 곱셈, 나눗셈 등을 하는 연산자

[표 4.1] C의 산술 연산자

 

- 덧셈류, 곱셈류 연산자들은 2개의 피연산자를 필요로하기 때문에, 이항이라고 불림.

- '단항 연산자'라는 표현은 어떤 상수가 양수임을 강조하기 위해 사용됨.

- 표 4.1에서 나오는 이항 연산자 중, %를 제외하면 정수와 실수형 피연산자 둘 다 허용하고, 섞어서 사용하는 것 또한 허용함. (만약 int, float형 피연산자가 동시에 사용되었다면 결과는 float형으로 나올 것)

 

- / 연산자, % 연산자는 특수하게 다뤄줘야 함.

  • / 연산자는 예상하지 못한 결과를 생성할 수도 있다. 만약 피연산자가 둘 다 정수라면, / 연산자는 소수점 부분을 삭제함으로서 결과값을 줄여 정수로 만든다. 즉, 1 / 2의 값은 0.5가 아니라 0이 나온다.
  • % 연산자는 피연산자가 정수여야한다. 만약 피연산자가 정수가 아니라면 컴파일되지 않는다.
  • /이나 %를 사용할 때 0을 우항 피연산자로 사용하는 경우 예상하지 못한 결과가 나올 수 있다.
  • [Q&A] /이나 %이 음수 피연산자와 함께 사용하게 되면 결과를 표현해주기가 매우 힘들다. C89 표준에 의하면 두 개의 피연산자 중 하나라도 음수면 나눗셈의 결과값은 반올림 되거나 반내림 될 수 있다고 되어있다. 예를 들면 -9 / 7의 값이 -1이거나 -2가 될 수 있다. 만약 i나 j가 음수라면 C89에서 i % j는 사용하는 방법에 따라 다르다. 예를 들어 -9 % 7은 -2거나 5가 될 수 있다. [C99] C99에선 나눗셈의 결과가 언제나 0과 가장 가까운 값을 갖는다. 즉 -9 / 7의 값은 -1이고, i % j의 경우 결과값의 부호는 i를 따라간다. 즉 -9 % 7은 -2이다.

 

 

📌 연산자 순서 및 결합 법칙

- 산술 연산자는 상대적 순서가 존재함. (연산자 순서 규칙)

- 순서 높음: + - (단항) * / % 순서 낮음: + - (이항) 

 

- 동일 순서 연산자들 여러개가 한 표현식에 존재한다면 어떤식으로 표현식을 처리해야 하나?

✅ 연산자의 결합 사용

✅ 이항산술연산자는 전부 좌향결합적 *왼쪽에서 오른쪽으로 결합

      (ex, i - j - k  (i - j) - k 와 같다. i * j / k  (i * j) / k 와 같다.)

✅ 단항산술연산자는 전부 향결합적 *오른쪽에서 왼쪽으로 결합

      (ex, - + i  -(+i)와 동일하다.)

 

 

🌐 [프로그래밍] 세계상품코드(UPC) 검사 기호 계산하기

몇년 간 미국, 캐나다에 제품을 판매하는 제조업자들은 각 제품에 바코드를 찍기 시작했다. 이 코드는 UPC라과도 알려져있는데, 제품과 제조업자에 대한 정보를 담고 있다. 각 바코드는 12자리의 숫자이며, 주로 바코드 선 아래에 적혀있다. 예를 들어 Stouffer's French Bread 페페로니 피자 패키지의 바코드 밑 숫자는 0 13800 15173 5로 바코드 선 밑에 적혀있다.

  • 첫 번째 자리는 제품의 유형을 나타낸다. 대부분의 경우 0 혹은 7이며, 무게를 재야하는 제품의 경우 2, 약이나 건강 관련 제품은 3, 쿠폰은 5이다. 첫 5개의 숫자들은 제조업자를 의미한다. 
  • 13800은 네슬리 미국 냉동식품지사를 의미한다.
  • 두 번째 5개 숫자들은 제품을 의미하고, 이는 패키지 사이즈를 포함한다.
  • 마지막 숫자는 '확인자릿수'로, 앞의 11개 숫자가 제대로 적혀있는지 확인한다. (만약, UPC가 제대로 스캔되지 않았다면, 첫 11개의 숫자들이 마지막 확인자릿수와 무관할 수 있어 상점의 바코드 스캐너는 전체 코드를 인식하지 않을 수 있다.)

 

- 확인자리수를 계산하는 방법은 다음과 같다.

  1. 홀수번째 숫자를 더한다
  2. 짝수번째 숫자를 더한다 (마지막 12번째는 제외)
  3. 첫번째 합을 3만큼 곱하고 두번째 합과 더한다
  4. 전체 합에서 1을 뺀다
  5. 결과값을 10으로 나눴을 때의 나머지를 구한다
  6. 9에서 이 나머지를 뺀다

 

이제 아무 UPC의 확인자릿수를 계산해주는 프로그램을 작성해보자. 우선 사용자로 하여금 11자리의 숫자를 입력하도록 하고, 이에 해당하는 확인자릿수를 출력해준다. 혼동을 피하기 위해 사용자는 첫번째 숫자, 두번째 5자리 숫자, 세번째 5자리 숫자를 따로따로 세 가지의 값을 입력하게 만든다. 이 프로그램이 다음과 같이 생겼다고 해보자.

 

🌐 upc.c

/* UPC의 확인자릿수를 계산함 */

#include <stdio.h>

int main(void)
{
    int d;
    int i1;
    int i2;
    int i3;
    int i4;
    int i5;
    int j1;
    int j2;
    int j3;
    int j4;
    int j5; 
    int first_sum;
    int second_sum;
    int total;

    printf("첫번째 (한자리수) 숫자를 입력해주세요: ");
    scanf("%1d", &d);
    printf("첫번째 다섯자리 숫자를 입력해주세요: ");
    scanf("%1d%1d%1d%1d%1d", &i1, &i2, &i3, &i4, &i5);
    printf("두번째 다섯자리 숫자를 입력해주세요: ");
    scanf(%1d%1d%1d%1d%1d", &j1, &j2, &j3, &j4, &j5);

    first_sum = d + i2 + i4 + j1 + j3 + j5;
    second_sum = i1 + i3 + i5 + j2 + j4;
    total = 3 * first_sum + second_sum;

    printf("확인자릿수: %d\n", 9 - ((total - 1) % 10));

    return 0;
}

 

 

 

💡 본 내용은 K.N.King의 C Programming: A Modern Approach 책을 참고하였습니다.

'📚 STUDY > 🔥 C' 카테고리의 다른 글

[4-3] 증감연산자  (0) 2024.09.03
[4-2] 할당연산자  (0) 2024.09.03
Q&A  (3) 2024.09.02
[3-2] scanf 함수  (0) 2024.09.02
[3-1] printf 함수  (4) 2024.09.02