אני לא חושב שיש לי הרבה מה להוסיף, רק להבהיר שאין
בכלל מה להשוות בין שני הטעוית השנייה היא ברוב המוחץ של המקרים
הרבה יותר חמורה.
השימוש בGOTO מותר לפי כל תקן אפשרי הוא לא רצוי כמעט תמיד.
כתיבת void main אסורה על פי התקנים הנפוצים, ואילו התוכנית
תעבוד כראוי || כמעט || תמיד.השימוש בGOTO בשפות כמו פסקל או C גורם לקפיצה בלתי מותנת
מנקודה אחת בקוד לנקודה אחרת. זאת מבלי להתייחס למצבם של כל מיני
משתנים אחרים מלבד הIP(שמציין איפה אני נמצא בקוד)
הבעיה העיקרית היא לגבי מצב המחסנית, ניסיון לבצע GOTO לתוך
פונקציה פנימית או החוצה מהפונקציה כמעט מובטח שיגרום לקריסת
התוכנית. אבל יש מקרים שהם פחות ברורים, קשה לדעת(למתכנת מתחיל)
בדיוק מה משפיע על מצב המחסנית. למשל הקוד הבא בC מאוד שגוי:
int foo(int n) { int i; for (i=0;i<n;++i) { int j=i*i; printf("%d",j); if (j>100) goto end; printf(" continuing\n"); } end: return 0; }
|
הקוד לעיל, מאוד סביר שיגרום לתוכנית לקרוס, שכן אני מקדם
את הSP כאשר אני מקצה זמנית את j על המחסנית, אבל אני לעולם לא
יוצא באופן מסודר מהבלוק בו j מוגדר. אני קופץ מעל קטע זה.
הצורה הנכונה לכתוב קטע הקוד לעיל היא בעזרת הפקודה break.
ובכלל, השימוש בGOTO הוא ממש לא מבני ולא מסודר. בכל פארדיגמה
תכנותית, אנו מחלקים את העבודה לתת משימות מסודרות בתוך בלוקים
של קוד, וסתם לקפוץ מאחד לשני זה לא ממש בסדר.
יש כמה מקומות מאוד מוגבלים שבהם השימוש בGOTO הוא בסדר,
אבל הם היוצא מן הכלל, ומשום שכל-כך קל להמנע משימוש בGOTO
ההמלצה שלי היא לא להשתמש בGOTO אלא אם כן אתם ממש מבינים למה
לא צריך להשתמש וממש מבינים מה אתם עושים.
DRYICE