ProgramlamaC Geliştirici

C dilinde i++ ve ++i arasındaki farkları tanımlayın. Hangi durumlarda hangi seçeneğin kullanılacağını belirtin ve karmaşık ifadelerde ne gibi tehlikeler doğurduklarını açıklayın.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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:

  • i++ (post-fiks): önce mevcut değeri verir, sonra artırır.
  • ++i (pre-fiks): önce değeri artırır, sonra yeni değeri verir.

Ö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.

Kandırmaca Soru

int a = i++ + ++i; ifadesinin sonucunda a değişkeninin değeri ne olur, eğer i = 1 ise?

Cevap:

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!

Konu hakkında bilgi eksikliğinden kaynaklanan gerçek hata örnekleri


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.