C++의 사전 증가 대 사후 증가 연산자

Jinku Hu 2023년10월12일
  1. C++에서 증가 전 작업과 사후 증가 작업의 차이점
  2. 동일한 변수의 다른 산술 연산과 함께 사후 증가 및 사전 증가 연산을 사용하지 마십시오
C++의 사전 증가 대 사후 증가 연산자

이 기사에서는 C++에서 사전 증가와 사후 증가의 차이점을 소개합니다.

C++에서 증가 전 작업과 사후 증가 작업의 차이점

두 연산 모두 단항 증가 연산자-++를 기반으로하며, 변수 값에 액세스하는 표현식에서 사용될 때 약간 다른 동작을 갖습니다. 일반적으로 변수는 증가 또는 감소 연산자와 결합하여 값을 1 씩 더 크게 / 작게 생성 할 수 있습니다. 그러나 사전 증가 연산은 주어진 변수를 처음에 수정 한 다음 액세스합니다. 반면에 post-increment 연산자는 원래 값에 액세스 한 다음 증분합니다. 따라서 값을 액세스하거나 저장하는 표현식에서 사용하면 연산자가 프로그램에 다른 영향을 미칠 수 있습니다. 예를 들어, 다음 예제 코드는 두 정수를0값으로 초기화 한 다음 각기 다른 연산자로 증가 된 값을 출력하면서 5 번 반복합니다. 사후 증가는0으로 인쇄를 시작하고4로 끝나는 반면, 사전 증가는1로 시작하여5로 끝납니다. 그럼에도 불구하고 두 정수에 저장된 최종 값은 동일합니다-5.

#include <iostream>

using std::cout;
using std::endl;

int main() {
  int i = 0, j = 0;

  while ((i < 5) && (j < 5)) {
    cout << "i: " << i++ << "  ";

    cout << "j: " << ++j << endl;
  }

  cout << "End of the loop, both have equal values:" << endl;
  cout << "i: " << i << "  "
       << "j: " << j << endl;

  exit(EXIT_SUCCESS);
}

출력:

i: 0  j: 1
i: 1  j: 2
i: 2  j: 3
i: 3  j: 4
i: 4  j: 5
End of the loop, both have equal values:
i: 5  j: 5

또는for루프의 조건식 내에서 다른 표기법을 사용하면 동일하게 작동합니다. 두 루프 모두5반복 실행됩니다. 그러나 일반적으로 코드가 최적화되지 않은 경우 성능 효율적인 변형이 될 수있는 사전 증가를 사용하는 것이 허용되는 스타일입니다.

#include <iostream>

using std::cout;
using std::endl;

int main() {
  int i = 0, j = 0;

  while ((i < 5) && (j < 5)) {
    cout << "i: " << i++ << "  ";

    cout << "j: " << ++j << endl;
  }

  cout << "End of the loop, both have equal values:" << endl;
  cout << "i: " << i << "  "
       << "j: " << j << endl;
  cout << endl;

  for (int k = 0; k < 5; ++k) {
    cout << k << " ";
  }
  cout << endl;

  for (int k = 0; k < 5; k++) {
    cout << k << " ";
  }
  cout << endl;

  exit(EXIT_SUCCESS);
}

출력:

i: 0  j: 1
i: 1  j: 2
i: 2  j: 3
i: 3  j: 4
i: 4  j: 5
End of the loop, both have equal values:
i: 5  j: 5

0 1 2 3 4
0 1 2 3 4

동일한 변수의 다른 산술 연산과 함께 사후 증가 및 사전 증가 연산을 사용하지 마십시오

사후 증가 및 사전 증가 연산자는 동일한 변수와 함께 사용될 때 산술 계산을 완전히 잘못 만들 수 있습니다. 예를 들어, 사후 증가와 동일한 변수의 곱셈을 결합하면 코드를 읽는 데 직관적이지 않고 부지런히 처리하지 않으면 오류가 발생하기 쉽습니다.

#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::vector;

int main() {
  vector<int> vec1 = {10, 22, 13, 41, 51, 15};

  for (int &k : vec1) {
    cout << k++ * k << ", ";
  }

  exit(EXIT_SUCCESS);
}

출력:

110, 506, 182, 1722, 2652, 240,
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Operator