2010-08-24 2 views
6

가능한 중복 :이 실제 시나리오에서
Why use ++i instead of i++ in cases where the value is not used anywhere else in the statement?
Incrementing in C++ - When to use x++ or ++x?실제 예제에서 사후 감소/증분 대 선행 감소/증분은 언제 사용됩니까?

i++ vs. ++i 

사용됩니까?

+1

다음을 포함하여 많은 질문이 중복되어 있습니다. http://stackoverflow.com/questions/24886/ http://stackoverflow.com/questions/467322/ http://stackoverflow.com/questions/1907140/http://stackoverflow.com/questions/484462/ http://stackoverflow.com/questions/467322/ http://stackoverflow.com/questions/24853/ –

+0

이것은 실제 사례를 요구하면서 중복되지 않습니다. . 아래의 RC의 대답을 참조하십시오. –

+1

계속 : http://stackoverflow.com/questions/561588/what-is-more-efficient-i-or-i http://stackoverflow.com/questions/24901/ http://stackoverflow.com/questions/ 53455/http://stackoverflow.com/questions/1116735/i-less-efficient-than-i-how-to-show-this http://stackoverflow.com/questions/3072421/difference-between-i-and -i http://stackoverflow.com/questions/2315705/what-is-the-difference-between-ii-in-for-loop-java –

답변

5

오래된 값이 반환되기를 원하는 경우 명백한 점은 후행 증가를 사용하는 것입니다.

더 미묘한 점은 사전 증가가 실제로 느려지지 않아야하며 임시 증가를 생성하지 못하고 이후 증가를 사용할 때 이전 값을 반환하지 않아 더 빠를 수 있다는 것입니다.

C++에서 사후 증가를 사용하는 실제 시나리오는 표준 컨테이너에서 지울 때입니다. 예를 들어 컴파일러 최적화에 대응

set<int> ctr; 
ctr.insert(1); 
ctr.insert(10); 
ctr.insert(12); 
ctr.insert(15); 

set<int>::iterator it = set.begin(); 

// Post-increment so the value returned to erase is that of the previous 
// iteration (i.e. begin()), yet the iterator stays valid due to the local 
// iterator being incremented prior to the erase call 
ctr.erase(it++); 

// Still valid iterator can be used. 
cout << "Value: " << *it << "\n"; 

, 그것은 사실이다 그러나 나는 그것이로 정확하게 당신이 달성하기 위해 노력하고 무엇 가능한 전달하는 것이 중요하다고 생각합니다. x ++에서 반환 된 값이 필요하지 않다면 요청하지 마십시오. 또한 증가 유형이 단순 유형이 아닌 경우에도 항상 동일한 최적화를 얻지 못할지 잘 모르겠습니다. 단순한 포인터가 아닌 반복자를 생각해보십시오. 이와 같은 경우에는 최적화와 관련하여 마일리지가 다를 수 있습니다. 즉, 후행 증가 연산자의 반환 값 (예 : 이전 값)이 필요하지 않는 한 항상 미리 증가됩니다.

+0

+1입니다. –

+1

사실 거의 모든 컴파일러는 일반적인 상황 (연산 결과가 무시되고 i가 과부하 증가/감소 연산자가없는 경우)에서'+++ '로 최적화 할 것이라고 생각합니다. 즉, 포스트 증가/감소 대신 사전 증가/감소를 선호하는 것으로 나타났습니다. 이는 액션의 의미를 더 잘 전달한다고 생각하기 때문입니다. 'i'가 커스텀'++'/'- '연산자를 가진 사용자 정의 타입이된다면 속도가 빨라질 것입니다. – bcat

+0

@bcat이 당신과 동의합니다. 대부분의 경우 사전 승격에 의미가 있으며, 학교에서 가르 칠 때 이것이 왜 그렇게 큰 이유인지 확신 할 수 없습니다. –

5

의 차이를 명확히하기 위해 최선의 설명은 다음과 같습니다

  • 내가 + + - 다음 내가 값을 어떤이 보유하고 값에 대한 i 값을 사용하여 증가하고,
  • 을 보관
  • ++ i - i의 값을 증가시키고 즉시 저장합니다. 다음에이 값을 사용합니다. 결정적인 차이 문이 평가 후에 하나 개의 단위입니다

는, 다른 하나는 문이 평가 전에 증가합니다.

+0

불행히도 Stackoverflow에는 평범한 영어가 정말 부족합니다. – MarcusJ

4

특별히 ++i의 동작이 필요하지 않는 한 i++을 사용하는 것이 좋습니다. 이는 왼쪽에 변수를 넣기 때문에 i += N과 일치합니다. 대부분이 사소한,하지만

for (i = 0; i < limit; ++i) 

병렬 구조의 부족과 함께 독자를 여행 때문에-for 루프에서, 나는 잘못++i을 고려하고 ...하는 김에 i++로 변경한다;

for (i = 0; i < limit; i++) 

루프 변수가 모든 세 절에서 동일한 위치에 있기 때문에 읽기가 훨씬 편리합니다.

성능 관련 인수는 hogwash입니다. 그 소금의 가치가있는 컴파일러는 차이가없는 경우 동일한 코드를 생성합니다.예, 여기에는 C++ 오버로드 된 연산자가 포함됩니다.

관련 문제