משפט else-if
בצורה דומה, לפעמים נרצה לבחור מתוך כמה אופציות. לכן, ניתן להוסיף למשפט if כמה חלקים נוספים שנרצה בשם else if שיטופלו לפי סדר. למשל, נניח שנרצה לחשב ציון לתלמיד:
#include <stdio.h>
int main() {
int score;
char grade;
scanf("%d", &score);
if(score >= 90) {
grade = 'A';
} else if(score >= 80) {
grade = 'B';
} else if(score >= 70) {
grade = 'C';
} else if(score >= 60) {
grade = 'D';
} else {
grade = 'F';
}
printf("Your grade is %c\n", grade);
}
כאשר משרשרים מספר משפטי if ו-else זה לזה, כל אחד מהתנאים מחושב לפי הסדר בהם הם מופיעים. במידה ואחד התנאים הוא true, מבצעים את בלוק הקוד המתאים. במידה ואף אחד מהתנאים לא מתקיים, אף אחד מהבלוקים לא מתבצע - אלא אם מוסיפים משפט else כמו שראינו בדוגמא.
אם בשרשרת if-else יותר מתנאי אחד מתקיים, הראשון מביניהם הוא זה שיתבצע בלבד:
if(5 > 7) {
printf("5 is greater than 7\n");
} else if(5 < 7) {
printf("5 is smaller than 7\n");
} else if(1 > 0) {
printf("1 is greater than 0\n");
}
הערה: בלוק הקוד של משפט if יכול להכיל בעצמו משפט if:
#include <stdio.h>
int main() {
int ADULT = 18, SENIOR = 65;
int age;
scanf("%d", &age);
if(age >= ADULT) {
printf("You are an adult\n");
if(age >= SENIOR) {
printf("You are a senior\n");
} else {
printf("You are not a senior\n");
}
} else {
printf("You are not an adult\n");
}
}
נשים לב כיצד פתיחה וסגירה נכונה של סוגריים יחד עם הזחה נכונה הופכים את הקוד לקריא וברור.
דוגמא: מה תדפיס התוכנית הבאה?
#include <stdio.h>
int main() {
int val = 0;
if (val > 0)
printf("Positive\n");
printf("Check complete\n");
else
printf("Non-positive\n");
return 0;
}
זו דוגמא לאיך כתיבה ללא סוגריים מסולסלים יכולה להוביל לבאגים: הקוד הזה לא יתקמפל בכלל! משפט else חייב להופיע מיד לאחר סיום הגוף של משפט if. כמו שראינו, הגוף של משפט if הוא המשפט שמגיע מיד אחריו - במקרה זה מכיוון שלא השתשמנו בסוגריים מדובר רק על השורה printf("Positive\n"). כלומר המשפט שמגיע לפני ה-else הוא בכלל printf("Check complete\n"), ולכן הקומפיילר יסרב לקמפל את הקוד.