Operator Precedence Hatası: Parantez Olmadan İfade Yazmanın Riski
Operator önceliği (precedence), bir ifadede hangi işlemin önce yapılacağını belirler. Parantez kullanmadan karmaşık bir ifade yazarsan, derleyici senin istediğin sırayla değil, kurallarına göre hesaplar. Bu da çoğu zaman yanlış sonuca yol açar.
Örneğin matematikçi olarak bildiğin çarpma, toplama, bölme gibi işlemlerin sırası vardır. Programlamada da öyle. Ama yazarken unutursan, kod sessizce hata üretir.
Sorun Nedir?
C/C++'da çarpma () bölme (/) toplama (+) çıkarmadan (-) daha yüksek önceliğe sahiptir. Bitwise işlemler ve karşılaştırma operatörleri de kendi aralarında sıralanmıştır. Parantez koymadan karmaşık bir ifade yazarsan, bu kurallar seni beklemez.
Pratik Örnek
Bir ürünün indirimli fiyatını hesapla. Orijinal fiyat 100, indirim yüzde 20, vergi yüzde 8. Doğru formül: (100 - 20% indirim) (1 + %8 vergi) olmalı.
1#include <stdio.h>23int main() {4double fiyat = 100;5double indirim_oran = 0.20;6double vergi_oran = 0.08;78// YANLIŞ: parantez olmadan9double yanlis = fiyat - indirim_oran * fiyat + vergi_oran * fiyat;10printf("Yanlis sonuc: %.2f\n", yanlis);1112// DOĞRU: parantez ile13double dogru = (fiyat - indirim_oran * fiyat) * (1 + vergi_oran);14printf("Dogru sonuc: %.2f\n", dogru);1516return 0;17}Çıktı:
1Yanlis sonuc: 96.002Dogru sonuc: 86.40Yanlış versiyonda önce çarpma yapılır, sonra toplama-çıkarma. Doğru versiyonda parantez sayesinde önce indirim uygulanır, sonra vergi eklenir.
Çözüm
Karmaşık ifadelerde her zaman parantez koy. Koda bakan başkası (ya da gelecekteki sen) kafası karışmasın. Operatör önceliğini ezberlemek yerine, parantez ile niyetini açık yaz. Kod okunabilirliği artar, hata azalır.
0 yorum