Tarihçe:
Artış ++ ve azalış -- operatörleri, C dilinin en eski sürümlerinde ortaya çıkmış olup, düşük seviyeli makine dilleri özelliklerinden esinlenilmiştir. Önek (++i, --i) ve sonek (i++, i--) biçimleri, programcıya farklı anlamlar sağlarken, hesaplama maliyeti minimum düzeydedir.
Sorun:
En büyük zorluk, önek ve sonek biçimlerinin farklı davranmasıdır: önek biçimi önce değeri artırır/azaltır, ardından sonucu döndürür; sonek biçimi ise önce mevcut değeri döndürür, ardından değişkeni değiştirir. İç içe ifadelerde bu durum sıkça kafa karışıklığına, beklenmedik davranışlara ve değerlerin hatalı kullanılmasına sebep olabilir.
Çözüm:
Her bir biçimin ne döndürdüğünü net bir şekilde ayırmak önemlidir. Önek versiyonu, yeni değeri hemen almak gerektiğinde kullanılır. Sonek versiyonu, eski değeri korumanın önemli olduğu durumlarda (örneğin, bir fonksiyona veya sayaç mantığına vermek için) kullanılır. İyi bir uygulama, birden fazla artış içeren karmaşık ifadelerden kaçınmak ve yan etkilerle birlikte kullanımdan sakınmaktır.
Kod örneği:
int i = 5; printf("%d\n", ++i); // 6 yazacak printf("%d\n", i++); // 6 yazacak, ama artık i 7 oldu
Temel özellikler:
i = i++ kullanmak mümkün mü ve ne olur?
i = i++ ifadesinin kullanılması belirsiz bir davranışa yol açar: derleyici beklenen sonucu garanti etme yükümlülüğünde değildir ve program tahmin edilemez bir şekilde çalışabilir.
Kod örneği:
int i = 1; i = i++; printf("%d\n", i); // Sonuç derleyiciye bağlı: 1 veya 2 yazılabilir
Aynı satırda birden fazla kez aynı değişkeni kullanmak artış işlemlerini tehlikeli hale getirmiyor mu?
Bir ifadede (örneğin, f(i++, i++)) aynı değişken üzerinde birden fazla değişiklik yapmak C standardına göre tanımsız bir davranışa yol açar. Nihai sonuç, belirli derleyici uygulamasına bağlıdır.
i++ her zaman ++i‘den daha hızlı mı?
Hayır. Modern derleyicilerde genellikle fark yoktur, çünkü derleyici her iki biçimi de optimize eder, eğer dönen değer ifadesinin kendisi kullanılmıyorsa.
Bir döngüde geliştirici şunları yazdı:
for (int i = 0; i < 10;) arr[i] = i++ * 2;
Artılar:
Eksiler:
for (int i = 0; i < 10; i++) arr[i] = i * 2;
Artılar:
Eksiler: