Menu
Coddy logo textTech

מה זו שגיאה לוגית (Logic Error)?

שגיאה לוגית (logic error) היא טעות בהיגיון של תוכנית, שגורמת לה להפיק תוצאה שגויה בלי לקרוס ובלי להציג שום הודעת שגיאה. הקוד תקין וכל שורה רצה, אבל הוא לא עושה את מה שהמתכנת התכוון שיעשה.

מאת Kevin Spektor, מייסד שותף ו-CTO

עודכן ב-24 בספטמבר 2026

לשלושה ציוני מבחן, 80, 90 ו-100, יש ממוצע של 90. התוכנית הזו רצה בלי שום תלונה ומדפיסה משהו אחר:

Average: 203.33333333333334

Python עשתה בדיוק את מה שהשורה אומרת. חילוק קורה לפני חיבור, ולכן רק הציון האחרון חולק ב-3, והתוצאה היא 80 + 90 + 33.33. המתכנת התכוון ל-(scores[0] + scores[1] + scores[2]) / 3. הוסיפו את הסוגריים והתוכנית מדפיסה Average: 90.0.

למה לא מופיעה הודעת שגיאה

המחשב בודק אם קוד תקין, לא אם הוא נכון. ה-parser בודק את הדקדוק, וכך נתפסת שגיאת תחביר. סביבת הריצה בודקת כל פעולה, וכך נתפסת שגיאת זמן ריצה כמו חלוקה באפס. חיבור של שלושה מספרים וחילוק של אחד מהם ב-3 הוא דקדוק תקין ופעולה חוקית, ולכן שתי הבדיקות עוברות.

רק מי שכתב את התוכנית יודע שהיא הייתה אמורה לחשב ממוצע. הכוונה הזו לא קיימת בשום מקום בקוד, ולכן שום כלי לא יכול להשוות אליה את התוצאה. שגיאה לוגית היא הפער בין מה שאמרתם למחשב לעשות לבין מה שרציתם שהוא יעשה.

סיבות נפוצות לשגיאות לוגיות

רוב השגיאות הלוגיות מגיעות מרשימה קצרה של דפוסים.

  • טעויות של אחד (off by one). לולאה רצה פעם אחת יותר מדי או פחות מדי. range(1, 5) מייצר 1, 2, 3 ו-4, כי הסוף לא נכלל. ראו איטרציה.
  • סדר פעולות. a + b / 2 מחלק רק את b, כמו בממוצע שלמעלה.
  • השוואה לא נכונה. < במקום שהיה צריך <=, או and במקום שהיה צריך or. תנאים הם ביטויים בוליאניים, ואופרטור שגוי אחד הופך את התוצאה עבור חלק מהקלטים.
  • תנאים בסדר הלא נכון. בשרשרת של if ו-elif, התנאי הראשון שהוא אמת מנצח, כך שבדיקה רחבה שמופיעה ראשונה מסתירה את הצרות יותר שמתחתיה.
  • המשתנה הלא נכון. מעדכנים את total בתוך לולאה אבל מדפיסים את subtotal.
  • הנחות על מספרים. 0.1 + 0.2 == 0.3 הוא False ב-Python, ב-Java וב-JavaScript, כי מספרי נקודה צפה הם קירובים. 7 // 2 הוא 3, לא 3.5.

הנה טעות סדר התנאים. ציון 95 אמור להיות A:

D
D
F

95 גדול או שווה ל-60, ולכן הענף הראשון מנצח וה-elif אף פעם לא מגיע. שימו את הסף הגבוה ביותר ראשון, וכל התוצאות נעשות נכונות.

סוגי שגיאות בתכנות

בדרך כלל ממיינים שגיאות תכנות לשלושה סוגים, לפי מתי הן מופיעות ומי מדווח עליהן.

שגיאת תחבירשגיאת זמן ריצהשגיאה לוגית
מתי היא מופיעהלפני שהתוכנית רצהבזמן שהיא רצהבזמן שהיא רצה, או שאף פעם לא שמים לב
מה מזהה אותהה-parser או הקומפיילרסביבת הריצה או מערכת ההפעלהאדם או בדיקה
האם התוכנית רצה?לאעד השורה שנכשלתכן, עד הסוף
הודעת שגיאהכן, עם מספר שורהכן, עם tracebackאין
דוגמה ב-Pythonif x > 3 בלי הנקודתיים10 / 0a + b / 2 לממוצע
איך מוצאים אותהקוראים את ההודעהקוראים את ה-tracebackמשווים את הפלט לתשובה ידועה

יש ספרי לימוד שמונים סוגים נוספים, ורובם נכנסים בתוך השלושה האלה. שגיאת טיפוס שהקומפיילר של Java דוחה, כמו incompatible types: String cannot be converted to int, מתגלה בזמן קומפילציה כמו שגיאת תחביר, ויש ספרים שקוראים לה שגיאה סמנטית. שגיאת linker קורית בשלב האחרון של בניית תוכנית C או C++, כשהוכרז על פונקציה אבל הקוד שלה לא נמצא בשום מקום. שגיאות חשבון, משאבים וקבצים, כמו חלוקה באפס, מחסור בזיכרון או פתיחת קובץ שלא קיים, הן כולן שגיאות זמן ריצה. יש קורסים שמשתמשים במונח "שגיאה סמנטית" גם כשם נוסף לשגיאה לוגית, אז בדקו לאיזו משמעות ספר לימוד מתכוון.

איך מוצאים שגיאה לוגית

  1. בדקו עם תשובה שכבר ידועה לכם. חשבו ידנית את התוצאה הנכונה לקלט קטן, ואז השוו. קל יותר לבדוק שלושה ציונים משלושת אלפים.
  2. הדפיסו את הערכים שבדרך. הדפסה של score ושל הענף שנבחר, או של מונה הלולאה בכל מעבר, מראה את הצעד המדויק שבו המציאות סוטה מהתוכנית שלכם.
  3. עברו על הקוד עם דיבאגר. הצבת breakpoint והרצה של שורה אחת בכל פעם עושות את אותו הדבר בלי לערוך את הקוד.
  4. בדקו את הקצוות. נסו 0, 1, הערך הגדול ביותר, רשימה ריקה והסף המדויק (60 ו-90 בדוגמת הציונים).
  5. הסבירו את הקוד בקול. תיאור של כל שורה למישהו אחר, או לברווז גומי, מכריח אתכם לומר מה השורה עושה ולא מה אתם מניחים שהיא עושה.

assert הופך תשובה ידועה לבדיקה אוטומטית. הוא לא עושה כלום כשהתנאי אמת, ועוצר את התוכנית כשהוא שקר:

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

בדיקה שנכשלת הופכת שגיאה לוגית שקטה לשגיאה רועשת עם מספר שורה. זה כל הרעיון שמאחורי בדיקות יחידה (unit testing).

שגיאות לוגיות בשפות אחרות

הדפוסים זהים בכל מקום, אבל לכל שפה יש מלכודות משלה. ב-JavaScript, "5" + 3 הוא המחרוזת "53", ואילו "5" - 3 הוא המספר 2, כך שערך שנקרא מטופס כטקסט יכול להיסכם לא נכון בלי שום שגיאה. ב-C, if (x = 5) משים 5 ל-x ותמיד אמת. Clang מזהיר על זה כברירת מחדל (using the result of an assignment as a condition without parentheses), אבל הקוד עדיין עובר קומפילציה ורץ, אז התייחסו לאזהרות של הקומפיילר ברצינות כמו לשגיאות.

לאן ממשיכים מכאן

השוו את העמוד הזה לעמודים על שגיאת תחביר ועל שגיאת זמן ריצה כדי לראות איך מדווחים על כל סוג. בלולאות גרות טעויות של אחד, ולכן העמוד על איטרציה והמדריך של Python ללולאות for הם קריאה טובה להמשך. כדי לתרגל מציאת תוצאות שגויות בתרגילים אמיתיים, נסו את קורס Python.

שאלות נפוצות

מה ההבדל בין שגיאת תחביר לשגיאה לוגית?
שגיאת תחביר שוברת את הדקדוק של השפה, ולכן התוכנית נדחית לפני שהיא רצה ומקבלים הודעה עם מספר שורה. שגיאה לוגית מצייתת לדקדוק בדיוק ורצה עד הסוף, אבל התוצאה שגויה, ואין שום הודעה. את שגיאת התחביר מוצאים בקריאת ההודעה; את השגיאה הלוגית מוצאים בבדיקת הפלט.
מה זו שגיאה לוגית ב-Python?
זה קוד Python שרץ בלי traceback אבל נותן תשובה שגויה. דוגמאות טיפוסיות הן range(1, 5) כשרציתם 1 עד 5 כולל, a + b / 2 כשרציתם (a + b) / 2, וענפי if שנבדקים בסדר הלא נכון. Python לא יכולה לזהות אותן, כי אין לה דרך לדעת למה התכוונתם.
מהם 5 סוגי השגיאות בתכנות?
רשימה נפוצה של חמישה היא שגיאות תחביר, שגיאות סמנטיות (של טיפוסים), שגיאות linker, שגיאות זמן ריצה ושגיאות לוגיות. שלוש הראשונות מתגלות בזמן שהתוכנית נבנית, שגיאות זמן ריצה מופיעות בזמן שהיא רצה, ושגיאות לוגיות מתגלות רק כתוצאות שגויות. קורסים רבים מלמדים רק שלושה: תחביר, זמן ריצה ולוגיקה.
האם שגיאה לוגית היא באג?
כן. באג הוא כל פגם שגורם לתוכנית להתנהג אחרת ממה שהתכוונו, ושגיאות לוגיות הן הסוג הנפוץ ביותר. קריסות והודעות שגיאה הן גם באגים, אבל הן מכריזות על עצמן, ואילו בשגיאה לוגית צריך שאדם או בדיקה יבחינו.
למה קשה למצוא שגיאות לוגיות?
כי שום דבר לא מצביע עליהן. אין מספר שורה ואין הודעה, והתוצאה השגויה עשויה להיראות סבירה, כמו ממוצע של 203 לשלושה ציוני מבחן שאף אחד לא בודק פעמיים. מוצאים אותן בהשוואת הפלט לתשובה שכבר ידועה לכם, ולכן בדיקות עם תוצאות ידועות חשובות.
איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל