2010-08-24 19 views
6

Olası çoğaltmaları: Bu gerçek senaryolarda
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?Gerçek yaşamda kullanılan örneklerde, azaltma/artırım ve ön azaltma/artırım ne zaman kullanılır?

i++ vs. ++i 

kullanılır?

+1

Bu gibi bir sürü soru kopyası: http://stackoverflow.com/questions/24886/ http://stackoverflow.com/questions/467322/ http://stackoverflow.com/questions/1907140 gerçek örnekler için soruyorum olarak/http://stackoverflow.com/questions/484462/ http://stackoverflow.com/questions/467322/ http://stackoverflow.com/questions/24853/ –

+0

Bu bir kopya değil . Lütfen aşağıdaki RC cevabına bakınız. –

+1

Devamı: 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 –

cevap

5

Geri gelen eski değeri döndürdüğünüzde, artırma sonrası artırmayı kullanırsınız.

Daha az incelikli olan şey, ön artırmanın gerçekten hiç yavaşlamadığı ve daha hızlı olabileceğinden ve art arda kullanıldığında eski bir değerin getirilmemesi ve geçici olmama nedeniyle daha hızlı olabileceğidir.

Standart konteynerlerden silerken C++ cinsinden arttırma işleminin kullanılması için gerçek bir senaryo. Örneğin: derleyici optimizasyon cevaben

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"; 

, bu doğrudur ama ben o kadar kesin olarak başarmak istediğiniz şeyi olabildiğince aktarmaya hep önemli olduğunu düşünüyorum. X ++ 'dan döndürülen değere ihtiyacınız yoksa, o zaman sormayın. Ayrıca, artırım türünüz basit bir tür değilse, her zaman aynı optimizasyonu alacağınızdan emin değilim. Sadece düz gösterici olmayan yineleyicileri düşünün. Bu gibi durumlarda, kilometreniz optimizasyon açısından farklılık gösterebilir. Kısacası, artırma-sonrası operatörün iadesine (yani eski değere) ihtiyacınız olmadıkça, her zaman önceden artırın.

+0

+1. –

+1

Aslında, hemen hemen her derleyicinin normal koşullar altında 'i ++' '' + i'yi optimize edeceğini (işlemin yok sayıldığını ve aşırı yüklenme/eksiltme operatörlerinin olmadığı) düşünüyorum. Bununla birlikte, eylemin anlamını daha iyi bir şekilde ele aldığını düşündüğümden, art arda artış/azaltma yerine, önceden artırmayı/azaltmayı tercih ediyorum. Ve eğer '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – bcat

+0

@bcat sizinle aynı fikirdedir .. çoğu durumda sadece ön-artış için mantıklıdır, neden okullarda öğretmenlik yaparken bu kadar büyük bir şey olduğundan emin değilsiniz. –

5

farklılıkları açıklığa kavuşturmak amacıyla en iyi açıklama:

  • i ++ - sonra i değerini almak her ne tutar değeri, için i değerini kullanmak bir artıracaktır ve
  • saklayın
  • ++ - i değerini artırıp hemen saklayın, daha sonra değerini kullanın. önemli fark ifadesi değerlendirilir ardına birimdir

başka açıklamada değerlendirilir önce artırılır.

+0

En kolay okunan cevabı buldunuz, maalesef Stackoverflow'da sade bir ingilizce yok. – MarcusJ

4

O i += N ile tutarlı solda, değişken koyar çünkü özellikle ++i davranışını gerekmedikçe i++ kullanmayı tercih ediyorum. Çoğunlukla bu küçük, ama

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

paralel yapının eksikliği ile okuyucuyu gezileri, çünkü döngülerine için de, ben yanlış olmak ++i düşünün ve geçerken i++ için değişecektir; Döngü değişkeni her üç maddeleri aynı konumda olduğu için

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

, okumak için çok güzel.

Performanstan argümanlar şangarttır. Tuzun değeri olan herhangi bir derleyici, farkın önemli olmadığı durumlarda tam olarak aynı kodu üretecektir.Evet, C++ aşırı yüklenen operatörleri içeren vakaları içerir.

İlgili konular