C dilinde post-fiks (i++) ve pre-fiks (++i) artırma işlemleri, değişkenin değerini 1 artırır, ancak döndürülen değer farklıdır:
Örnek:
int i = 5; int a = i++; // a == 5, i == 6 int j = 5; int b = ++j; // b == 6, j == 6
Basit ifadelere geldiğinde fark önemsizdir, ancak karmaşık ifadelerde (örneğin, birden fazla artırma işlemi içeren ifadelerde) belirsiz davranışa neden olabilir.
int a = i++ + ++i;ifadesinin sonucunda a değişkeninin değeri ne olur, eğeri = 1ise?
Hesaplama, operatörlerin değerlendiriliş sırasına bağlıdır, bu da standart tarafından garanti edilmez ve belirsiz davranışa (undefined behavior) yol açar, çünkü i değişkeni sırayla birden fazla kez değiştirilir. Böyle yazmamak gerekir!
Böyle bir kod örneği:
int i = 1; int a = i++ + ++i; // belirsiz davranış! Böyle kullanmayın!
Hikaye
Büyük bir projede dizi içindeki indeks hesaplaması arr[i++] = getValue(++i); şeklinde yazılmıştı — geliştirici eski değeri saklarken yeni değeri almak istemişti. Farklı derleyicilerde davranış farklılık gösterdi: bazen bir değer diğerini örtüyor, bazen program çöküyordu. Sebep — aynı ifadede i'nin geçersiz çoklu değiştirilmesi.
Hikaye
Bir gömülü projede, sayacın artırılması karmaşık bir ifadenin parçası olarak yapılıyordu: if (buffer[i++] == TERMINATOR && ++i < SIZE) ... — donanımda bazen yanlı indeks alınıyordu çünkü hesaplama sırası farklılık gösteriyordu, bu da başlatılmamış verilere ulaşmaya neden oluyordu.
Hikaye
Kodun başka bir derleyiciye taşınması sırasında, operatörlerin hesaplama sırasındaki farklılık, while (arr[i++] && i < MAX && arr[++i]) gibi bir döngünün tahmin edilemeyen şekilde davranmasına neden oldu. Hata, müşterinin cihazında test aşamasının sonuçlarıyla ancak bulundu.