לולאת for
לולאת for קצת יותר מסובכת בסינטקס ביחס ללולאת while, אבל היא מאפשרת לכתוב בצורה פשוטה וקריאה פעולה מאוד נפוצה בשפה. על מנת לפשט את ההבנה, נבין מהי הפעולה עם דוגמא ולאחר מכן נציג את הסינטקס.
נחזור לדוגמא של חישוב העצרת. מה בעצם רצינו לעשות?
- לאתחל משתנה כלשהו לערך התחלתי (במקרה העצרת ל-2, הערך הראשון שיש להכפיל בו בחישוב עצרת)
- לספור מהערך ההתחלתי עד לערך כלשהו (במקרה העצרת עד ל-
numberשהכניס המשתמש) - לבצע פעולה על כל המספרים בין הערך ההתחלתי לסופי (במקרה העצרת להכפיל)
לולאת 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;
}
}
קצת סינטקס חדש! נפרק:
- בתוך הסוגריים
()של לולאת ה-forמופיעות שני;שמפרידות לשלושה חלקים. int i = 2- החלק הראשון הוא משפט שמתבצע פעם אחת לפני האיטרציה הראשונה של הלולאה. במקרה זה השתמשנו בו בשביל להצהיר על משתנה חדש ולתת לו ערך. בדרך כלל נשתמש בחלק זה בשביל להצהיר על משתנה שיבצע את הספירה המדוברת, הנקראת enumeration.i <= number- החלק האמצעי הוא תנאי בוליאני שנבדוק לפני כל איטרציה של הלולאה (גם הראשונה). אם התנאי לא מתקיים, מפסיקים את ביצוע הלולאה וממשיכים לביצוע קוד שאחריה. בדרך כלל נשתמש בחלק זה עם תנאי כמו>או=!בשביל להגדיר ביצוע עד תנאי מסוים.++i- החלק האחרון של גוף הלולאה מכיל משפט שמתבצע לאחר סיום כל איטרציה של הלולאה. בדרך כלל נשתמש בחלק זה בשביל לקדם את המשתנה שהצהרנו עליו בחלק הראשון.
לאחר שראינו דוגמא, הסינטקס המלא של לולאת for הוא:
for (expr1; expr2; expr3) {
body
}
כאשר:
- לפני תחילת הלולאה נבצע את
expr1. - לפני כל איטרציה (כולל הראשונה) נבדוק האם
expr2הואtrueובמידה וכן נבצע אתbody, אחרת נסיים את ריצת הלולאה. - לאחר כל איטרציה נבצע את
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);
}
הערות
-
לולאות בשפת C הרבה פעמים משתמשות במשתנה הנקרא אינדקס, שאיתו בדרך כלל בודקים את התנאים הנדרשים לקיום הלולאה. בניגוד למשתנים אחרים, להם בדרך כלל נקרא בשמות מלאים (כמו
eggs_neededאוfactorial), מקובל לקרוא לאינדקסים באותi. במידה וצריך יותר מאינדקס אחד, בדרך כלל קוראים להםi, j, kוכך הלאה. בלולאתfor, התאי שאנחנו מאתחלים כחלק מהלולאה יהיה לרוב אינדקס. -
ניתן להשמיט אחד או יותר מחלקי הלולאה - אין חובה לאתחל משתנה למשל או לבדוק תנאי.
-
בגרסאות ישנות יותר של שפת C לא היה ניתן להצהיר על משתנה חדש בתור לולאת
for, ולכן לפעמים תפגשו את הסינטקס הבא:
int i;
for (i = 0; i < n; i++) {
// ...
}
ניתן לכתוב כך גם היום, אם כי כשנדבר על זמן חיות (lifetime) של משתנים נבין שיש יתרונות לצורת הכתיבה בה מצהירים על האינדקס i כחלק מהלולאה.
- גם עם לולאות
forניתן לייצר לולאות אינסופיות, עם כי הסינטקס עבור כך קצת פחות קריא:
for(;;) {
// Infinite loop
}