Τελεστές & Λογικές/Αριθμητικές Εκφράσεις |
Η C όπως και κάθε γλώσσα προγραμματισμού χρησιμοποιεί διάφορους τελεστές για να εκτελέσει πράξεις, να αναπαραστήσει αριθμητικές και λογικές εκφράσεις και να δημιουργήσεις δομές ελέγχου. Ετσι λοιπόν στην C ανα κατηγορία έχουμε τους τελεστές που ακολουθούν.
Ο τελεστής καταχώρησης:
Για το τελεστή
καταχώρησης (ή καλύτερα ανάθεσης σε
μεταβλητή -assigment) χρησιμοποιείται το
σύμβολο του ίσον (=) που έχει βέβαια
διαφορετική έννοια απο ότι στα μαθηματικά. H
εντολή:
var2
= 52;
σημαίνει ότι δίνω την τιμή 52
στην μεταβλητή var2. Αν δώσω παρακάτω την
εντολή:
var2
= var2 +1;
που ενώ μαθηματικώς δεν "στέκει",
"αυξάνω" κατα μία μονάδα την τιμή που
ήδη υπάρχει καταχωρημένη στην μεταβλητή var2,
δηλαδή η νέα τιμή της var2 μετά την
εκτέλεση της συγκεκριμένης εντολής θα είναι
53!
Φυσικά δεν μπορείτε να
καταχωρήσετε τιμή σε μία σταθερά, ενώ στην C
μπορώ να κάνω πολλαπλή καταχώρηση. Δηλαδή
ισχύει το:
x=y=z=54;
Εδώ οι καταχωρήσεις
γίνονται από δεξιά προς τα αριστερά, δηλαδή
πρώτα πάιρνει την τιμή 54 η μεταβλητή z,
μετά η μεταβλητή y και τέλος η x.
Οι αριθμητικοί τελεστές:
Προκειται για τους:
+
|
Πρόσθεση
|
-
|
Αφαίρεση
|
*
|
Πολαπλασιασμός
|
/
|
Διαίρεση
|
%
|
Υπόλοιπο (πχ., 25 % 4 μας δίνει 1), καλείται "modulo" και εφαρμόζεται μόνο σε ακεραίους.
|
Για κάθε τελεστή
απαιτούνται 2 όροι (εκτός από τον τελεστή
"-", που είναι δυνατόν να
χρησιμοποιηθεί και σαν πρόσημο), οι οποίοι
μπορεί να είναι σταθερές ή μεταβλητές.
ilikia=etos1 - etos2;
printf("%d", 95-55);
celsious=(-25);
Tα κενά διαστήματα δεν
παίζουν ρόλο και μπορείτε να
χρησιμοποιήστε παρενθέσεις για
μαθηματικές παραστάσεις:
result = -(b+2)*a + (c +3*(a-b);
Η C ακολουθεί την
αλγεβρική προτεραιότητα στους
αριθμητικούς τελεστές. Δηλαδή μεγαλύτερη
προτεραιότητα έχουν οι παρενθέσεις, μετά το
προσημο (δηλαδή το μείον), ακολουθούν ο
πολλαπλασιασμός, η διαίρεση και το modulo και
τέλος οι τελεστές πρόσθεσης και αφαίρεσης.
Η εντολή καταχώρησης έχει μικρότερη
προτεραιότητα από όλες τις πράξεις. Η φορά των πράξεων είναι από αριστερά προς
δεξιά για όλους τους αριθμητικούς τελεστές,
εκτός αν χρησιμοποιήστε το μείον σαν
πρόσημο, οπότε η φορά είναι από δεξιά προς
αριστερά!
Οι τελεστές συσχετισμού:
Τελεστές που τους χρησιμοποιούμε για την δημιουργία απλών λογικών εκφράσεων συσχετισμού (σύγκρισης). Αυτοί είναι:
<
|
Μικρότερο από (πχ. αν i<j επιστρέφει 1 αν το i είναι μικρότερο από το j)
|
>
|
Μεγαλύτερο από
|
<=
|
Μικρότερο από ή ίσο
|
>=
|
Μεγαλύτερο από ή ίσο
|
= =
|
Λογικό ισον
|
!=
|
Διάφορο (όχι ίσο)
|
Το αποτέλεσμα μιάς
λογικής έκφρασης είναι είτε 1 (αληθές) είτε 0 (ψευδές).
Για παράδειγμα αν έχω x=2;
και y=3; τότε
η έκφραση (x > y)
επιστρέφει 0. Οι λογικές εκφράσεις
χρησιμοποιούνται σαν συνθήκες στις εντολές ελέγχου (και
όχι μόνο). Προσέξτε το σύμβολο της ισότητας
που είναι ένα διπλό ισον (= =)! Επίσης θα
πρέπει να γνωρίζετε ότι στην C η προτεραιότητα των
τελεστών συσχέτισμού είναι μικρότερη από αυτή των
αριθμητικών τελεστών, ενώ είναι μεγαλύτερη
από αυτή του τελεστή καταχώρησης. Τι τιμή θα πάρει η
μεταβλητή i στο κώδικα που ακολουθεί;
j = k =13;
i = j = = k;
Θα πάρει την τιμή 1,
διότι ο τελεστής της ισότητας (λογικό ίσον =
=) έχει μεγαλύτερη προτεραιότητα από τον
τελεστή καταχώρησης (ένα απλό ίσον =). Αρα
λοιπόν, καθώς οι μεταβλητές j και k
είναι ίσες το αποτέλεσμα της σύγκρισης
αυτών (j = = k) θα είναι αληθές, δηλαδή 1,
τιμή που θα πάρει η μεταβλητή i. Ωραία
πράγματα!
Οι λογικοί τελεστές:
Πρόκειται για τελεστές που μας επιτρέπουν να συνδυάσουμε απλές εκφράσεις συσχετισμού και να δημιουργήσουμε πιό πολύπλοκες λογικές εκφράσεις. Εχουμε λοιπόν:
&&
|
Λογικό "και" (AND) μας επιστρέφει 1 αν και οι δύο operands είναι όχι μηδέν, διαφορετικά 0)
|
| |
|
Λογικό διαζευτικό "ή" (είτε - OR)
|
!
|
Λογική άρνηση (ΝΟΤ)
|
Το αποτέλεσμα μιάς
έκφρασης με λογικούς τελεστές είναι
είτε μηδέν (ψευδές), είτε όχι μηδέν (αληθές).
Με τους τελεστές && και | |, απαιτείται η
χρήση 2 όρων, ενώ με τον
τελεστή ! ενός.
( x > 10 && x < 20)
Η προτεραιότητα των
τελεστών συσχέτισμού είναι μεγαλύτερη από
αυτή των λογικών τελεστών ενώ η
προτεραιότητα και των δύο (συσχετισμού και
λογικών) είναι μικρότερη από αυτή των
αριθμητικών τελεστών! Γιά παράδειγμα η
λογική έκφραση που ακολουθεί μας βρίσκει αν
ένα έτος είναι δίσεκτο ή όχι:
(etos % 4 = = 0 && etos % 100 != 0 | | etos % 400
= = 0)
Δίσεκτα έτη θεωρούνται όσα
διαιρούνται ακριβώς με το 4 αλλά όχι με το 100.
Εξαίρεση αποτελούν τα έτη που διαιρούνται ακριβώς με
το 400, που θεωρούνται επίσης δίσεκτα. Αν το έτος
λοιπόν είναι δεν είναι δίσεκτο τότε η λογική έκφραση επιστρέφει την
τιμή 0 (ψευδής). Παρατηρείστε ότι η έκφραση
που ακολουθεί, κάνει τήν ίδια δουλειά:
(
! (etos % 4) && (etos % 100) | | ! (etos % 400) )
Οι τελεστές επιπέδου bit:
Με την C μπορούμε να κάνουμε πράξεις σε επίπεδο bit με τους τελεστές:
<<
|
Ολίσθηση (shift) προς αριστερά. Για παράδειγμα η εντολή i << j το i μετακινείται αριστερά j bits. Οι θέσεις των bits που αδειάζουν "γεμίζουν" με 0. Προσέξτε διότι δεν λαμβάνεται υπόψη το bit του προσήμου! |
>>
|
Ολίσθηση (shift) προς δεξιά. Αν η μεταβλητή είναι unsigned τότε τα κενά bits "γεμίζουν" με 0. Αν η μεταβλητή έχει πρόσημο τότε τα bits που αδειάζουν, είτε παίρνουν το bit του προσήμου (0 ή 1 - θετική ή αρνητική μεταβλητή), είτε "γεμίζουν" με 0. Εξαρτάται από τον compiler... |
~ |
Δυαδική άρνηση (όπου 1
μπαίνει 0 και όπου 0 μπαίνει 1 - one's complement).
Υπάρχει ένας μόνο όρος
|
& |
Δυαδικό "και" σε
επίπεδο bit (συξευξη / AND). Δηλαδή η εντολή var
= var & 0177, βάζει 0 σε όλα τα
bits της μεταβλητής num, εκτός από τα 7 δεξιά bits
αυτής. Προσέξτε ο τελεστής εδώ απαιτεί δύο
όρους. Υπάρχει και ο τελεστής
της διευθυνσης (&) με τον ίδιο
συμβολισμό που όταν μπαίνει μπροστά σε μία
μεταβλητή αναφέρεται στην διεύθυνση της.
|
| |
Δυαδικό διαζευτικό "ή"
σε επίπεδο bit (διάζευξη / OR). Η εντολή var
= var | ON, όπου υπάρχει 1 στις
θέσεις των bits της ON, μπαίνει αντίστοιχα 1
στις θέσεις των bits της var. |
^
|
Αποκλειστική διάζευξη "ή" (exclusive OR) σε επίπεδο bit. Δηλαδή, η εντολή var1 ^ var2 στις θέσεις που τα bits και των δύο μεταβλητών έχουν την ίδια τιμή μπαίνει 0, ενώ στις θέσεις που τα bits έχουν διαφορετική τιμή μπαίνει 1.
|
Οι τελεστές αυξησης/μείωσης:
Πρόκειται γιά τους τελεστές:
+ + που κάνει αύξηση μιας μεταβλητής κατά 1 μονάνδα π.χ i++;
- - που κάνει μείωση μιας μεταβλητής κατά 1 π.χ i-- ;
Εχει σημασία αν οι τελεστές αύξησης/μείωσης τεθούν πρίν (++i) ή μετά (i--) την μεταβλητή. Στο πρόγραμμα που ακολουθεί:
#include <stdio.h>
main()
{
int a=3, b=3;
int syna, synb;
syna=a++;
synb=++b;
printf ("a= %d, syna= %d, b= %d, synb=%d\n", a, syna, b, synb);
}
το αποτέλεσμα που θα
πάρουμε από την εντολή printf θα είναι:
a=4, syna=3, b=4, synb=4
και αυτό διότι στην
εντολή syna=a++; γίνεται χρήση της τιμής
της μεταβλητής a, πριν γίνει η αύξηση
κατά μία μονάδα, ενώ στην synb=++b; μετά
την αύξηση της μεταβλητής b κατά μία
μονάδα. Επίσης η διαφορά μεταξύ των εντολών:
alpha=beta*delta++ ;
(I)
και
alpha=beta*++delta ; (II)
είναι ότι στην (I) πρώτα
πολλαπλασιάζεται η beta με την delta
και μετά αυξάνεται η delta κατά μία μονάδα,
ενώ στην (II) πρώτα αυξάνεται η delta κατα
μιά μονάδα και μετά πολλαπλασιάζεται με την
beta.
Οι τελεστές εκχώρησης:
+= Πρόσθεση σε μεταβλητή. Παράδειγμα: x+=1; είναι το ιδίο όπως x=x+1
-= Αφαίρεση από μεταβλητή. Παράδειγμα: x-=1; (όπως x=x-1)
*= Πολλαπλασιασμός μεταβλητής. Παράδειγμα: x*=3; (όπως x=x*3)
/= Διαίρεση μεταβλητής. Παράδειγμα: x/=2; (όπως x=x/2)
%= Το υπόλοιπο. Παράδειγμα: alpha %=2 (οπως alpha=alpha %2)
>>= Ολίσθηση δεξιά. Παράδειγμα: beta >>= 3 (τα bits της beta ολίσθησαν δεξιά κατα 3 θέσεις)
<<= Ολίσθηση αριστερά. Παράδειγμα: beta <<= 3 (τα bits της beta ολίσθησαν αριστερά κατα 3 θέσεις)
&= Σύζευξη (AND). Παράδειγμα:var &= 0177 (όπως var = var & 0177)
|= Διάζευξη (OR). Παράδειγμα: var | = 0177
^= Αποκλειστική διάζευξη (exclusive OR). Παράδειγμα: var | = 0177
Μας δίνει την διευθύνση της μνήμης που αποθηκευεται μιά μεταβλητή. Αν για παράδειγμα έχω μία ακέραια μεταβλητή ALPHA ο συμβολισμός &ALPHA μας δίνει την διεύθυνση της μεταβλητής στην μνήμη. Ετσι αν η μετaβλητή ALPHA περιέχει τον αριθμό 32 (alpha=32) και αποθηκεύεται στην διεύθυνση 4294967246, τότε η εκτέλεση της εντολής:
printf ("Value of ALPHA:%d, Address of ALPHA:%u \n", ALPHA, &ALPHA);
θα μας δώσει:
Value of ALPHA:32, Address of ALPHA:4294967246
Προσέξτε, για να εμφανιστεί σωστά η διεύθυνση χρησιμοποιήθηκε ο προσδιοριστής %u (χωρίς πρόσημο ακέραιος).
Ο τελεστής συνθήκης (?):
Γενική μορφή: έκφραση ? εντολή-1 : εντολή-2
Αν η (λογική) έκφραση είναι αληθής τότε αναπτύσσεται η εντολή-1, διαφορετικά αναπτύσσεται η εντολή-2. Ουσιαστικά πρόκειται για μία συμπαγής μορφή της εντολής if-else:
if (έκφραση)
εντολή-1
else
εντολή-2
Για παράδειγμα num = (x<=5) ? 1 : 0; Η μεταβλητή num θα πάρει την τιμή 1 αν το x είναι μικρότερο ή ίσο του 5, διαφορετικά θα πάρει την τιμή 0.
Προτεραιότητες μεταξύ των τελεστών της C:
Ιεραρχία | Τελεστές | Φορά |
1 | ( ) [ ] . -> | Από αριστερά πρός δεξιά |
2 | ! ~ ++ -- &(διεύθυνση) *(indirection) (type) sizeof | Από δεξιά πρός αριστερά |
3 | *(πολλαπλασιασμός) / % | Από αριστερά πρός δεξιά |
4 | + - | Από αριστερά πρός δεξιά |
5 | << >> | Από αριστερά πρός δεξιά |
6 | < <= > >= | Από αριστερά πρός δεξιά |
7 | = = != | Από αριστερά πρός δεξιά |
8 | & (AND) | Από αριστερά πρός δεξιά |
9 | ^ | Από αριστερά πρός δεξιά |
10 | | | Από αριστερά πρός δεξιά |
11 | && | Από αριστερά πρός δεξιά |
12 | | | | Από αριστερά πρός δεξιά |
13 | ? : | Από δεξιά πρός αριστερά |
14 | = += -= *= /= %= &= ^= |= <<= >>= | Από δεξιά πρός αριστερά |
15 |
, |
Από αριστερά πρός δεξιά |
Στην προηγούμενη ενότητα | ||
Κ.Βασιλάκης / ΤΕΙ Κρήτης |