if, switch, while, for, κλπ.).ifif είναι:if (⟨παράσταση⟩)elseelse και μετά είναι προαιρετικό. Αν δεν υπάρχει και η ⟨παράσταση⟩ είναι ψευδής, ο έλεγχος θα πάει στην επόμενη εντολή του προγράμματος, δηλαδή στην πρώτη εντολή μετά το if.else μπορεί να προκαλέσει προβλήματα στην αναγνωσιμότητα προγραμμάτων με εμφωλευμένες εντολές if, αν δεν υπάρχει σαφής ομαδοποίηση με άγκιστρα. Αν δεν υπάρχουν άγκιστρα που να επιβάλλουν συγκεκριμένη δομή, κάθε else αντιστοιχεί στην αμέσως προηγούμενη if που δεν έχει else.Τι ακριβώς σημαίνει το παρακάτω;
if (n > 0)
if (a > b)
z = a;
else
z = b;
Προσοχή! Ο μεταγλωττιστής δεν ασχολείται με τη στοίχιση.
Αυτό:
if (n > 0) {
if (a > b)
z = a;
else
z = b;
}
Αν θέλαμε το else να αντιστοιχεί στο πρώτο if, έπρεπε να το γράψουμε έτσι:
if (n > 0) {
if (a > b)
z = a;
}
else
z = b;
if είναι όταν θέλουμε να ελέγξουμε μία σειρά από επάλληλες συνθήκες, και ανάλογα με το ποια θα βρεθεί ότι ισχύει πρώτη, να εκτελέσουμε ένα μπλοκ εντολών. Αυτό γίνεται ως εξής:if (⟨παράσταση⟩\(_1\))else if (⟨παράσταση⟩\(_2\))else if (⟨παράσταση⟩\(_{n-1}\))else ⟨μπλοκ εντολών⟩\(_n\)if θα μπορούσε να γραφεί σε μία εκδοχή με στοίχιση ως εξής:if (⟨παράσταση⟩\(_1\))elseif (⟨παράσταση⟩\(_2\))elseif (⟨παράσταση⟩\(_{n-1}\))elseΈνα παράδειγμα:
if (x > 0) {
sign = 1;
printf("Number is positive\n");
}
else if (x < 0) {
sign = -1;
printf("Number is negative\n");
}
else {
sign = 0;
printf("Number is zero\n");
}
switchswitch είναι:switch (⟨παράσταση⟩) {case ⟨σταθερά⟩\(_1\):case ⟨σταθερά⟩\(_2\):default:switch είναι μία διακλαδωμένη εντολή απόφασης που λειτουργεί όπως περιγράφεται στη συνέχεια.case με την ίδια σταθερά.default).case, ο έλεγχος μεταφέρεται στις εντολές της επόμενης case, εκτός αν τελευταία εντολή της προηγούμενης case είναι η break. Δεν είναι καλή πρακτική οι εντολές μίας case να συνεχίζουν με αυτές της επόμενης, εκτός αν ισχύει το επόμενο.case συνεχόμενα και βάζουμε την ομάδα εντολών στο τελευταίο απ’ αυτά.default είναι προαιρετική. Αν δεν υπάρχει και δεν ταιριάζει καμία case, ο έλεγχος μεταφέρεται μετά την εντολή switch.Παράδειγμα:
switch (x) {
case 1: printf("one\n");
break;
case 2:
case 3: printf("two or three\n");
break;
case 4: printf("four\n");
break;
default: printf("other\n");
break;
}
Τι θα γινόταν αν έλειπαν κάποιες break; Γιατί βάλαμε break και στην default περίπτωση;
whilewhile είναι:while (⟨παράσταση⟩)Παράδειγμα:
f = 1;
while (--n)
f = f*(n+1);
Τι υπολογίζει αυτό το while;
while στο http://www.di.uoa.gr/~ip/cprogs/capitalize.c.while είναι:dowhile (⟨παράσταση⟩)Παράδειγμα:
f = 1;
do {
f = f*n;
} while (--n);
Τι υπολογίζει αυτό το while;
do/while στο http://www.di.uoa.gr/~ip/cprogs/picomp.c.while είναι ότι στην πρώτη περίπτωση το ⟨μπλοκ εντολών⟩ μπορεί και να μην εκτελεσθεί καμία φορά, αν η ⟨παράσταση⟩ είναι αρχικά ψευδής, ενώ στην εκδοχή do/while, το ⟨μπλοκ εντολών⟩ θα εκτελεσθεί τουλάχιστον μία φορά, αφού η ⟨παράσταση⟩ ελέγχεται στο τέλος.forfor είναι:for (⟨παράσταση⟩\(_1\) ; ⟨παράσταση⟩\(_2\) ; ⟨παράσταση⟩\(_3\));while (⟨παράσταση⟩\(_2\)) {;Παράδειγμα:
f = 1;
for (i=1 ; i <= n ; i++)
f = f*i;
Τι υπολογίζει αυτό το for;
for στα http://www.di.uoa.gr/~ip/cprogs/easter.c και http://www.di.uoa.gr/~ip/cprogs/magic.c.; υπάρχουν κανονικά.for ( ; ; ), (κόμμα), με τον οποίο μπορούμε να κατασκευάσουμε μία σύνθετη παράσταση που θα υπολογισθεί από αριστερά προς τα δεξιά. Η τιμή της σύνθετης παράστασης ισούται με την τιμή της δεξιότερης από τις απλές που την συνιστούν.Μερικές φορές, θέλουμε να γράψουμε μία εντολή for που θα ελέγχεται από περισσότερους του ενός δείκτες. Αυτό γίνεται χρησιμοποιώντας τον τελεστή , στην ⟨παράσταση⟩\(_1\) και στην ⟨παράσταση⟩\(_3\). Παράδειγμα:
for (i=0, j=n ; i <= j ; i++, j--)
printf("%d\n", i*j);
break και continuebreak είναι αυτή που είδαμε στην εντολή switch, για τον τερματισμό της ακολουθίας εντολών που θα εκτελεσθούν όταν ταιριάξει κάποια συγκεκριμένη case.Επίσης, με την εντολή break, μπορούμε να τερματίσουμε βιαίως τις επαναλήψεις ενός βρόχου (while, do/while ή for), πριν ισχύσει η συνθήκη τερματισμού (ή όταν ο βρόχος είναι ατέρμων). Παράδειγμα:
while (!finished) {
......................
if (bad_data)
break;
......................
}
Με την εντολή continue, ο έλεγχος στο εσωτερικό ενός βρόχου μεταφέρεται στο τέλος του, για να αρχίσει η επόμενη επανάληψη. Παράδειγμα:
for (i=0 ; i < n ; i++) {
if (a[i] < 0) /* Ignore negative elements */
continue;
............. /* Process positive elements */
}
goto και ετικέτεςgoto.Η goto μπορεί να χρησιμοποιηθεί σε πολύ εξειδικευμένες περιπτώσεις, για παράδειγμα όταν θέλουμε να γίνει βίαιη έξοδος από εμφωλευμένους βρόχους, όταν ο έλεγχος βρίσκεται σε κάποιο εσωτερικό βρόχο. Αυτό δεν μπορεί να γίνει με την εντολή break. Παράδειγμα:
for (i=0 ; i < n ; i++)
for (j=0 ; j < m ; j++)
if (a[i] == b[j])
goto found;
.............. /* Didn't find common element */
found:
.............. /* Found a[i] == b[j] */
goto βλάπτει σοβαρά την ιδέα του δομημένου προγραμματισμού, γιατί μπορεί να οδηγήσει σε προγράμματα δυσανάγνωστα και δύσκολα συντηρήσιμα, και γι’ αυτό πρέπει να χρησιμοποιείται σπάνια, αν όχι καθόλου. 1Στα πλαίσια του συγκεκριμένου μαθήματος, απλά ΑΠΑΓΟΡΕΥΕΤΑΙ η χρήση της. ↩