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,
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