Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

Studies

לולאת for

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

  1. לאתחל משתנה כלשהו לערך התחלתי (במקרה העצרת ל-2, הערך הראשון שיש להכפיל בו בחישוב עצרת)
  2. לספור מהערך ההתחלתי עד לערך כלשהו (במקרה העצרת עד ל-number שהכניס המשתמש)
  3. לבצע פעולה על כל המספרים בין הערך ההתחלתי לסופי (במקרה העצרת להכפיל)

לולאת for מאפשרת לנו לשלב את שלושת המרכיבים האלו לכדי שורה אחת שלאחריה תגיע הלולאה. נכתוב מחדש את העצרת:

int main() {
    int number = -1;
    while (number <= 0) {
        printf("Enter a positive number\n");
        scanf("%d", &number);
    }
    int factorial = 1;
    for (int i = 2; i <= number; i++) {
        factorial *= i;
    }
}

קצת סינטקס חדש! נפרק:

  1. בתוך הסוגריים () של לולאת ה-for מופיעות שני ; שמפרידות לשלושה חלקים.
  2. int i = 2 - החלק הראשון הוא משפט שמתבצע פעם אחת לפני האיטרציה הראשונה של הלולאה. במקרה זה השתמשנו בו בשביל להצהיר על משתנה חדש ולתת לו ערך. בדרך כלל נשתמש בחלק זה בשביל להצהיר על משתנה שיבצע את הספירה המדוברת, הנקראת enumeration.
  3. i <= number - החלק האמצעי הוא תנאי בוליאני שנבדוק לפני כל איטרציה של הלולאה (גם הראשונה). אם התנאי לא מתקיים, מפסיקים את ביצוע הלולאה וממשיכים לביצוע קוד שאחריה. בדרך כלל נשתמש בחלק זה עם תנאי כמו > או =! בשביל להגדיר ביצוע עד תנאי מסוים.
  4. ++i - החלק האחרון של גוף הלולאה מכיל משפט שמתבצע לאחר סיום כל איטרציה של הלולאה. בדרך כלל נשתמש בחלק זה בשביל לקדם את המשתנה שהצהרנו עליו בחלק הראשון.

לאחר שראינו דוגמא, הסינטקס המלא של לולאת for הוא:

for (expr1; expr2; expr3) {
    body
}

כאשר:

  1. לפני תחילת הלולאה נבצע את expr1.
  2. לפני כל איטרציה (כולל הראשונה) נבדוק האם expr2 הוא true ובמידה וכן נבצע את body, אחרת נסיים את ריצת הלולאה.
  3. לאחר כל איטרציה נבצע את expr3.

הצורה הנפוצה ביותר בה נפגוש ונשתמש בלולאת for היא ריצה על כל המספרים בין 0 לבין ערך כלשהו. למשל, נסכום את כל המספרים בין 0 ל-1000 במספר שורות קצרות:

#include <stdio.h>
#define UPPER_BOUND 1000
int main() {
    int sum = 0;
    for (int i = 0; i < UPPER_BOUND; i++) {
        sum += i;
    }
    printf("sum = %d\n", sum);
}

הערות

  1. לולאות בשפת C הרבה פעמים משתמשות במשתנה הנקרא אינדקס, שאיתו בדרך כלל בודקים את התנאים הנדרשים לקיום הלולאה. בניגוד למשתנים אחרים, להם בדרך כלל נקרא בשמות מלאים (כמו eggs_needed או factorial), מקובל לקרוא לאינדקסים באות i. במידה וצריך יותר מאינדקס אחד, בדרך כלל קוראים להם i, j, k וכך הלאה. בלולאת for, התאי שאנחנו מאתחלים כחלק מהלולאה יהיה לרוב אינדקס.

  2. ניתן להשמיט אחד או יותר מחלקי הלולאה - אין חובה לאתחל משתנה למשל או לבדוק תנאי.

  3. בגרסאות ישנות יותר של שפת C לא היה ניתן להצהיר על משתנה חדש בתור לולאת for, ולכן לפעמים תפגשו את הסינטקס הבא:

int i;
for (i = 0; i < n; i++) {
    // ...
}

ניתן לכתוב כך גם היום, אם כי כשנדבר על זמן חיות (lifetime) של משתנים נבין שיש יתרונות לצורת הכתיבה בה מצהירים על האינדקס i כחלק מהלולאה.

  1. גם עם לולאות for ניתן לייצר לולאות אינסופיות, עם כי הסינטקס עבור כך קצת פחות קריא:
for(;;) {
    // Infinite loop
}