Mantık Hatası (Logic Error) Nedir?
Mantık hatası (logic error), bir programın akıl yürütmesindeki, çökmeden ya da hiçbir hata mesajı göstermeden yanlış sonuç üretmesine yol açan bir yanlıştır. Kod geçerlidir ve her satır çalışır, ama programcının istediği şeyi yapmaz.
Güncellendi: 24 Eylül 2026
Üç sınav notunun, 80, 90 ve 100'ün, ortalaması 90'dır. Bu program tek bir şikayet olmadan çalışır ve başka bir şey yazdırır:
Average: 203.33333333333334
Python satırın söylediğini tam olarak yaptı. Bölme toplamadan önce yapılır, bu yüzden yalnızca son not 3'e bölündü ve sonuç 80 + 90 + 33,33 oldu. Programcı (scores[0] + scores[1] + scores[2]) / 3 demek istemişti. Parantezleri ekle, program Average: 90.0 yazdırır.
Neden hata mesajı çıkmaz
Bilgisayar kodun doğru olup olmadığını değil, geçerli olup olmadığını kontrol eder. Ayrıştırıcı dilbilgisini kontrol eder ve bir sözdizimi hatasını yakalar. Runtime her işlemi kontrol eder ve sıfıra bölme gibi bir çalışma zamanı hatasını yakalar. Üç sayıyı toplayıp birini 3'e bölmek geçerli bir dilbilgisi ve yasal bir işlemdir, bu yüzden iki kontrol de geçer.
Programın bir ortalama hesaplaması gerektiğini yalnızca onu yazan kişi bilir. Bu niyet kodun hiçbir yerinde yoktur, dolayısıyla hiçbir araç sonucu onunla karşılaştıramaz. Mantık hatası, bilgisayara yapmasını söylediğin şey ile yapmasını istediğin şey arasındaki farktır.
Mantık hatalarının yaygın nedenleri
Mantık hatalarının çoğu kısa bir kalıp listesinden gelir.
- Bir eksik ya da bir fazla (off-by-one) hataları. Bir döngü bir kez fazla ya da eksik çalışır.
range(1, 5)1, 2, 3 ve 4 üretir, çünkü bitiş değeri dahil değildir. Bkz. yineleme. - İşlem önceliği.
a + b / 2yalnızcab'yi böler, yukarıdaki ortalamada olduğu gibi. - Yanlış karşılaştırma.
<=gereken yerde<, ya daorgereken yerdeand. Koşullar boolean ifadelerdir ve tek bir yanlış operatör bazı girdiler için sonucu tersine çevirir. - Yanlış sırada koşullar. Bir
ifveelifzincirinde ilk doğru koşul kazanır; bu yüzden başa konan geniş bir test, altındaki daha dar testleri gizler. - Yanlış değişken. Bir döngü içinde
totalgüncelleyipsubtotalyazdırmak. - Sayılar hakkında varsayımlar. Python, Java ve JavaScript'te
0.1 + 0.2 == 0.3sonucuFalseolur, çünkü kayan noktalı sayılar yaklaşık değerlerdir.7 // 23.5 değil, 3'tür.
İşte koşul sırası hatası. 95 alan bir öğrenci A almalı:
D
D
F
95, 60'tan büyük ya da eşit olduğu için ilk dal kazanır ve elif satırına hiç ulaşılmaz. En yüksek eşiği başa koy, her sonuç doğru olur.
Programlamada hata türleri
Programlama hataları genellikle ne zaman ortaya çıktıklarına ve onları neyin bildirdiğine göre üç türe ayrılır.
| Sözdizimi hatası | Çalışma zamanı hatası | Mantık hatası | |
|---|---|---|---|
| Ne zaman ortaya çıkar | Program çalışmadan önce | Program çalışırken | Program çalışırken ya da hiç fark edilmez |
| Onu ne tespit eder | Ayrıştırıcı ya da derleyici | Runtime ya da işletim sistemi | Bir insan ya da bir test |
| Program çalışır mı? | Hayır | Hatalı satıra kadar | Evet, sonuna kadar |
| Hata mesajı | Evet, satır numarasıyla | Evet, traceback ile | Yok |
| Python örneği | İki noktası olmayan if x > 3 | 10 / 0 | Ortalama için a + b / 2 |
| Nasıl bulunur | Mesajı oku | Traceback'i oku | Çıktıyı bilinen bir cevapla karşılaştır |
Bazı ders kitapları daha fazla tür sayar ve çoğu bu üçünün içine sığar. Java derleyicisinin reddettiği incompatible types: String cannot be converted to int gibi bir tip hatası, sözdizimi hatası gibi derleme zamanında bulunur ve bazı kitaplar buna anlamsal hata (semantic error) der. Bağlayıcı (linker) hatası, bir C ya da C++ programı derlenirken son adımda, bir fonksiyon tanımlanmış ama kodu hiçbir yerde bulunamamışsa olur. Sıfıra bölme, belleğin tükenmesi ya da olmayan bir dosyayı açma gibi aritmetik, kaynak ve dosya hatalarının hepsi çalışma zamanı hatasıdır. "Anlamsal hata" terimi bazı kurslarda mantık hatasının başka bir adı olarak da kullanılır; bu yüzden bir ders kitabının hangi anlamı kullandığını kontrol et.
Mantık hatası nasıl bulunur
- Cevabını zaten bildiğin bir durumla test et. Küçük bir girdi için doğru sonucu elle hesapla, sonra karşılaştır. Üç notu kontrol etmek üç bin notu kontrol etmekten kolaydır.
- Aradaki değerleri yazdır.
scoredeğerini ve seçilen dalı ya da her turda döngü sayacını yazdırmak, gerçeğin planından ayrıldığı adımı tam olarak gösterir. - Debugger ile adım adım ilerle. Bir breakpoint koyup her seferinde bir satır çalıştırmak, kodu düzenlemeden aynı işi yapar.
- Sınırları test et. 0, 1, en büyük değer, boş bir liste ve eşiğin tam kendisini dene (not örneğinde 60 ve 90).
- Kodu sesli anlat. Her satırı başka birine ya da bir lastik ördeğe anlatmak, satırın ne yaptığını varsaydığın şeyi değil, gerçekte ne yaptığını söylemeye zorlar.
Bir assert, bildiğin bir cevabı otomatik bir kontrole dönüştürür. Koşul doğruysa hiçbir şey yapmaz, yanlışsa programı durdurur:
Traceback (most recent call last):
File "main.py", line 10, in <module>
assert grade(95) == "A", "95 should be an A"
^^^^^^^^^^^^^^^^
AssertionError: 95 should be an A
Başarısız bir test, sessiz bir mantık hatasını satır numarası olan yüksek sesli bir hataya dönüştürür. Birim testinin (unit testing) bütün fikri budur.
Diğer dillerde mantık hataları
Kalıplar her yerde aynıdır ama her dilin kendi tuzakları vardır. JavaScript'te "5" + 3 string "53" olur, "5" - 3 ise sayı 2 olur; bu yüzden bir formdan metin olarak okunan bir değer hiçbir hata vermeden yanlış toplanabilir. C'de if (x = 5), x değişkenine 5 atar ve her zaman doğrudur. Clang bunun için varsayılan olarak uyarı verir (using the result of an assignment as a condition without parentheses) ama kod yine derlenir ve çalışır; bu yüzden derleyici uyarılarını hatalar kadar ciddiye al.
Sırada ne var
Her türün nasıl bildirildiğini görmek için bu sayfayı sözdizimi hatası ve çalışma zamanı hatası sayfalarıyla karşılaştır. Bir eksik ya da bir fazla hataları döngülerde yaşar; bu yüzden yineleme sayfası ve Python'daki for döngüleri rehberi iyi bir sonraki okuma olur. Gerçek alıştırmalarda yanlış sonuçları bulmayı pratik etmek için Python kursunu dene.
Sıkça Sorulan Sorular
Sözdizimi hatası ile mantık hatası arasındaki fark nedir?
Python'da mantık hatası nedir?
range(1, 5), (a + b) / 2 istediğinde a + b / 2 ve yanlış sırada kontrol edilen if dalları. Python bunları tespit edemez, çünkü ne demek istediğini bilmesinin bir yolu yoktur.