ΠΕΡΙΕΧΟΜΕΝΑ
§
ΣΤΑΘΕΡΕΣ
o
BACKSLASH CHARACTER CONSTANTS
§
ΤΕΛΕΣΤΕΣ
o
ΣΧΕΣΙΑΚΟΙ
ΚΑΙ ΛΟΓΙΚΟΙ ΤΕΛΕΣΤΕΣ
o
Ο ΤΕΛΕΣΤΗΣ
ΧΡΟΝΟΥ ΜΕΤΑΦΡΑΣΗΣ sizeof
o
Ο ΤΕΛΕΣΤΗΣ
, (COMMA OPERATOR)
o
ΟΙ
ΤΕΛΕΣΤΕΣ . (DOT) KAI -> (ARROW)
o
ΜΕΤΑΤΡΟΠΗ
ΤΥΠΩΝ ΣΤΙΣ ΕΚΦΡΑΣΕΙΣ
o
CASTS
Η ΔΟΜΗ
ΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ C
Όλες οι
δεσμευμένες λέξεις της C είναι γραμμένες με μικρά γράμματα. Στην C τα μικρά
διαφέρουν από τα κεφαλαία. Για παράδειγμα το else αποτελεί δεσμευμένη λέξη της C, ενώ το ELSE δεν αποτελεί. Οι δεσμευμένες λέξεις της C
απαγορεύεται να χρησιμοποιηθούν σαν ονόματα ταυτοτήτων (μεταβλητές, σταθερές,
συναρτήσεις, κλπ).
Όλα τα
προγράμματα C αποτελούνται από μία ή περισσότερες συναρτήσεις. Η μόνη συνάρτηση
η οποία απαραίτητα πρέπει να υπάρχει είναι η main ( ) και είναι η πρώτη συνάρτηση που καλείται όταν αρχίζει η
εκτέλεση ενός προγράμματος.
Στην ουσία
η main ( ) δεν είναι δεσμευμένη
λέξη της C αλλά σε ένα καλογραμμένο πρόγραμμα δείχνει τι κάνει το πρόγραμμα
καλώντας άλλες συναρτήσεις. Πάντως δεν πρέπει να χρησιμοποιείται σαν όνομα
μεταβλητής γιατί θα δημιουργήσει σύγχυση στον compiler.
Ένα
πρόγραμμα C αποτελείται από μία σειρά συναρτήσεων. Η συνάρτηση χρησιμοποιείται
με ευρύτερη έννοια απ’ ότι σε άλλες γλώσσες. Οι συναρτήσεις της C
συμπεριλαμβάνουν τη θεωρία των υπορουτίνων και διαδικασιών όπως επίσης και τις
συμβατικές συναρτήσεις της PASCAL.
Η C
διαθέτει μεθόδους επεξεργασίας Ι / Ο. Έτσι τα περισσότερα προγράμματα
περιλαμβάνουν κλήσεις συναρτήσεων οι οποίες περιέχονται στις standard βιβλιοθήκες της γλώσσας.
Η Turbo C συνοδεύεται από βιβλιοθήκες οι οποίες δίνουν
λύσεις σε αρκετές απαιτήσεις. Όταν μία συνάρτηση καλείται, η οποία δεν αποτελεί
μέρος του προγράμματος, η C θυμάται το όνομά της. Αργότερα ο linker συνδέει το πρόγραμμα με τον αντικειμενικό κώδικα που
βρίσκεται στις βιβλιοθήκες. Η δράση μια συνάρτησης εξαρτάται πλήρως από τις
εντολές που χρησιμοποιήθηκαν στον ορισμό της και από τις τιμές των ορισμάτων,
αν υπάρχουν. Το αποτέλεσμα μπορεί να είναι μία επιστρεφόμενη τιμή, όπως
συμβαίνει στις συναρτήσεις ή απλά μία ενέργεια όπως συμβαίνει στις διαδικασίες.
Καθολικές Δηλώσεις
main( )
{
Γενικές
Μεταβλητές;
Δηλώσεις Προγράμματος;
}
f1( )
}
Τοπικές
Μεταβλητές;
Δηλώσεις Προγράμματος;
}
Η Turbo C ορίζει τα ονόματα τα
οποία χρησιμοποιούνται για αναφορά σε μεταβλητές, συναρτήσεις, ετικέτες και
διάφορα άλλα αντικείμενα οριζόμενα από τον χρήστη σαν ταυτότητες (identifiers).
Μία
ταυτότητα μπορεί να διαθέτει από 1 ως 32 χαρακτήρες. Ο πρώτος χαρακτήρας πρέπει
να είναι γράμμα ή underscore ( _ ) ενώ
οι επόμενοι γράμματα, αριθμοί ή underscores. Η Turbo C επιτρέπει και τη χρήση $, αλλά δεν είναι στάνταρ
και δεν ενδείκνυται.
Έτσι:
ΣΩΣΤΟ ΛΑΘΟΣ
Count1 1Count
Test23 hi ! There
high_balance high. . balance
Στη C τα
κεφαλαία και τα μικρά χαρακτηρίζονται ως διαφορετικά. Έτσι τα count, Count και COUNT είναι διαφορετικές ταυτότητες.
Υπάρχουν 5
βασικοί τύποι δεδομένων στην C. character, integer, floating
point, double floating
point και valueless.
|
Τύπος |
Εύρος Bit |
Εύρος Τιμών |
|
char |
8 bit |
0 έως
255 (ASCII χαρ. ή
οποιοδήποτε 8 bit) |
|
int |
16 bit |
-32768
έως +32767 |
|
float |
32 bit |
3.4E-38 έως 3.4E+38 |
|
double |
64 bit |
1.7E-308
έως 1.7E+308 |
|
void |
0 bit |
valueless |
Ο τύπος char χρησιμοποιείται για την αποθήκευση ASCII χαρακτήρων. Ο τύπος int για την αποθήκευση ακεραίων. Οι τύποι float και double
για την αποθήκευση πραγματικών αριθμών (οι πραγματικοί αριθμοί έχουν
ακέραιο και κλασματικό μέρος).
Ο τύπος void έχει δύο χρήσεις. Η πρώτη χρησιμοποιείται κατηγορηματικά
για τη δήλωση μιας συνάρτησης που δεν επιστρέφει τιμή, ενώ η δεύτερη για τη
δημιουργία generic
pointers. Η C
υποστηρίζει και άλλους τύπους όπως:
structures (Δομές)
unions (Ενώσεις_Sets)
bit fields (Δυαδικά
πεδία)
enumerations (Απαριθμητές)
user defined Types (Ορισμένοι από το χρήστη)
ΤΡΟΠΟΠΟΙΗΤΕΣ ΤΥΠΩΝ (TYPE MODIFIERS)
Εξαιρώντας τον τύπο void, οι βασικοί τύποι δεδομένων συνοδεύονται από
μερικούς τροποποιητές (modifiers). Ένας
τροποποιητής χρησιμοποιείται για να αλλάξει το νόημα του βασικού τύπου και να
τον προσαρμόσει σε διάφορες καταστάσεις με μεγαλύτερη ακρίβεια.
Αυτοί είναι:
signed Προσημασμένος
unsigned Απρόσημος
long Μεγάλος
short Μικρός
Οι
παραπάνω τροποποιητές μπορούν να προσαρμοστούν στους τύπους char και int. Ωστόσο
το long μπορεί να προσαρμοστεί
στον τύπο double. Είναι
πλεονασμός πάντως να δηλώνουμε έναν ακέραιο σαν signed. Η διαφορά μεταξύ signed και unsigned integers είναι στον τρόπο με τον οποίο ερμηνεύεται το highvalue bit.
Π.χ.
127 σε δυαδικό :
00000000 01111111
-127 > > :
10000000 01111111
|
Τύπος |
Εύρος Bit |
Εύρος Τιμών |
|
char |
8 |
-128 έως +127 |
|
unsigned char |
8 |
0 έως 255 |
|
singed char |
8 |
-128 έως +127 |
|
int |
16 |
-32768 έως 32767 |
|
unsigned int |
16 |
0 έως 65535 |
|
signed int |
16 |
-32768 έως 32767 |
|
short [int] |
16 |
-32768 έως 32767 |
|
unsigned short [int] |
16 |
0 έως 65535 |
|
long [int] |
32 |
-2147483648 έως
214748364 |
|
float |
32 |
3.4E-38 έως 3.4E+38 |
|
double |
64 |
1.7E-308 έως 1.7E+308 |
|
long double |
64 |
1.7E-308
έως 1.7E+308 |
|
unsigned long [int] |
32 |
0 έως
+4294967295 |
ΤΡΟΠΟΠΟΙΗΤΕΣ ΠΡΟΣΠΕΛΑΣΗΣ (ACCESS MODIFIERS)
H Turbo C έχει
δύο είδη τροποποιητών οι οποίοι χρησιμοποιούνται για να ελέγχουμε τους τρόπους
με τους οποίους οι μεταβλητές προσπελαύνονται ή τροποποιούνται. Αυτοί είναι οι:
const (Σταθερός)
volatile (Ασταθής)
Οι μεταβλητές που έχουν δηλωθεί σαν const δε μπορούν να αλλάξουν περιεχόμενο κατά τη διάρκεια
της εκτέλεσης του προγράμματος.
Π.χ.
const int
a = 10; Εδώ δηλώνουμε μία μεταβλητή, την a η οποία δε μπορεί να αλλάξει τιμή αλλά μπορεί να
χρησιμοποιηθεί σε άλλους τύπους ή εκφράσεις.
Μία
σταθερά μπορεί να λάβει τιμή, είτε από κάποια κατηγορηματική έκφραση,
είτε από
κάποια έννοια η οποία εξαρτάται από το hardware.
Ο τροποποιητής volatile χρησιμοποιείται για να πει στον compiler ότι η τιμή μιας μεταβλητής μπορεί
να αλλάξει με τρόπους όχι ρητά ορισμένους από το πρόγραμμα. Για παράδειγμα μία
διεύθυνση μιας συνολικής (global) μεταβλητής
μπορεί να περαστεί στη ρουτίνα του ρολογιού του συστήματος για να κρατά την ώρα
του συστήματος. Σ’ αυτή την περίπτωση τα περιεχόμενα της μεταβλητής αλλάζουν
χωρίς τη χρήση κατηγορηματικών δηλώσεων στο πρόγραμμα. Αυτό είναι σημαντικό
γιατί η turbo C
αυτόματα θα κάνει την παραδοχή ότι το περιεχόμενο της μεταβλητής παραμένει
ανέπαφο.
Είναι δυνατό να χρησιμοποιήσουμε
τους τροποποιητές const και volatile ταυτόχρονα.
Όλες οι μεταβλητές πρέπει να έχουν
δηλωθεί πριν χρησιμοποιηθούν. Ο τρόπος δήλωσης είναι:
Τύπος
μετ1, μετ2, μετ3, …, μετν;
Πχ:
int i, j, l;
short
int si;
unsigned
int ui;
double balance, profit, loss;
Υπάρχουν
τέσσερα βασικά μέρη στα οποία δηλώνονται οι μεταβλητές.
-
Μέσα στις συναρτήσεις
-
Στη δήλωση των παραμέτρων της συνάρτησης και
-
Έξω από όλες τις συναρτήσεις, στην αρχή ενός
αυτόνομου προγράμματος.
-
Έξω από όλα τα προγράμματα (σε αυτόνομο αρχείο ή πρίν
τη συνάρτηση main() των
προγραμμάτων μιας εφαρμογής).
Έτσι
καλούνται:
-
Local
Variables (Τοπικές)
-
Formal
Parameters (Τυπικοί παράμετροι)
-
General
Variables (Γενικές)
-
Global
Variables (Καθολικές)
ΤΟΠΙΚΕΣ
ΜΕΤΑΒΛΗΤΕΣ (LOCAL VARIABLES)
Οι μεταβλητές οι οποίες δηλώνονται
μέσα σε μία συνάρτηση ονομάζονται local
variables. Σε
πολλές περιπτώσεις τις συναντούμε και σαν automatic variables γιατί η
C, προαιρετική χρησιμοποιεί τη λέξη auto για τη
δήλωσή τους. Οι τοπικές μεταβλητές θα αναφέρονται μόνο σε δηλώσεις και
εκφράσεις που βρίσκονται στο ίδιο τμήμα που αυτές έχουν δηλωθεί. Οι τοπικές
μεταβλητές δεν είναι αναγνωρίσιμες έξω από το τμήμα του κώδικα που έχουν
δηλωθεί. Σημειώνεται ότι ένα τμήμα κώδικα ξεκινά όταν ανοίγει ένα άγκιστρο (curly brace) και τελειώνει όταν συναντηθεί άγκιστρο που κλείνει.
Ένα από τα πιο σημαντικά πράγματα
για την κατανόηση των local
variables είναι ότι
υπάρχουν μόνο εφόσον το τμήμα του κώδικα για το οποίο γράφτηκαν εκτελείται.
Έτσι μία τοπική μεταβλητή δημιουργείται τη στιγμή της εισόδου στο block και καταστρέφεται τη στιγμή της εξόδου. Το πιο
συνηθισμένο block κώδικα το
οποίο χρησιμοποιείται μια τοπική μεταβλητή είναι η συνάρτηση.
Π.χ.
func1( )
{
int x;
x=10;
}
func2(
)
{
int x,y;
x=-199 ;
y=200 ;
}
Η μεταβλητή x δηλώθηκε δύο φορές, μία στην func1( ) και μία στην func2( ). Η x στην func1( ) δεν
έχει καμία σχέση ή επιρροή με την x στην func2( ), γιατί κάθε x είναι γνωστό μόνο στο δικό του τμήμα.
Είναι κοινή πρακτική να δηλώνονται
όλες οι απαιτούμενες τοπικές μεταβλητές στην αρχή της συνάρτησης. Αυτό γίνεται
για την απλούστευση της συνάρτησης του προγράμματος. Πάντως δεν είναι
απαραίτητο γιατί οι μεταβλητές μπορούν να δηλωθούν μέσα σε οποιοδήποτε block.
Π.χ.
func1( )
{
int x;
scanf(“%d”, &x);
if
(x==1)
{
char 5[80] ;
printf(“Cuter
Name”);
}
}
Εδώ η μεταβλητή s θα δημιουργηθεί κατά την
είσοδο στο block και θα
καταστραφεί κατά την έξοδο. Επιπλέον η s είναι γνωστή μόνο μέσα στο if block
και δεν αναφέρεται πουθενά αλλού, ούτε ακόμα μέσα στη συνάρτηση που
περιέχει.
Το μεγαλύτερο όφελος που κερδίζουμε
δηλώνοντας μια τοπική μεταβλητή είναι η εξοικονόμηση μνήμης και αυτό γιατί δεν
έχουμε δέσμευση RAM αν δεν
εκτελεστεί το τμήμα στο οποίο έχει δηλωθεί η μεταβλητή. Επειδή οι τοπικές
μεταβλητές δημιουργούνται και καταστρέφονται με την κλήση και την έξοδο από μία
ρουτίνα, είναι λογικό να χάνουν τα περιεχόμενά τους μετά το τέλος αυτής. Αυτό
σημαίνει ότι δεν διατηρούν τα περιεχόμενά τους μεταξύ των διάφορων κλήσεων.
ΤΥΠΙΚΕΣ ΠΑΡΑΜΕΤΡΟΙ (FORMAL PARAMETERS)
Ενδέχεται να χρησιμοποιήσουμε
μεταβλητές σαν παραμέτρους σε συναρτήσεις ή ρουτίνες. Η δήλωσή τους γίνεται
μέσα στις παρενθέσεις της συνάρτησης αλλά και μετά από αυτές.
Π.χ.
synartisi (a,b)
int a ;
float b ;
{
εντολές;
}
Πρέπει φυσικά να δηλωθεί και ο τύπος
αυτών των μεταβλητών και εφόσον γίνει αυτό χρησιμοποιούνται σαν τοπικές
μεταβλητές μέσα στη συνάρτηση. Φυσικά θα πρέπει να είναι ίδιου τύπου με τις
μεταβλητές που χρησιμοποιούνται για την κλήση της συνάρτησης.
Η Turbo C ενδέχεται να δώσει αποτέλεσμα ακόμη και σε περίπτωση
λάθους. Υπάρχουν λίγα run-time errors και καθόλου έλεγχος ορίων (bound checking). Σαν
προγραμματιστής έχετε την ευθύνη να σιγουρέψετε ότι δε θα συμβούν λάθη.
ΚΑΘΟΛΙΚΕΣ ΜΕΤΑΒΛΗΤΕΣ (GLOBAL VARIABLES)
Αντίθετα από τις τοπικές μεταβλητές
οι συνολικές είναι γνωστές σε όλο το φάσμα του προγράμματος και χρησιμοποιούνται από κάθε κομμάτι του.
Επίσης συγκρατούν τις τιμές τους καθ’ όλη τη διάρκεια της εκτέλεσης του κώδικα.
Τις δηλώνουμε έξω από κάθε συνάρτηση (ακόμα και τη main). Προσπελαύνονται από οποιαδήποτε έκφραση σε οποιαδήποτε
συνάρτηση όπου και αν βρίσκεται αυτή. Τυπικά η δήλωση γίνεται πριν από τη main( ), αλλά μπορεί να δηλωθεί έξω από κάθε συνάρτηση,
φυσικά πριν χρησιμοποιηθεί.
#include <stdio.h>
int
count;
main(
)
{
count=100;
func1( );
}
func1(
);
{
int temp;
temp=count;
func2(
);
}
func2( )
{
int
count;
count=50;
}
Οι συναρτήσεις main( ) και func1( )
χρησιμοποιούν τη μεταβλητή count χωρίς να
έχει γίνει δήλωση μέσα σε αυτές. Επίσης στην func2( ) υπάρχει μία μεταβλητή count η οποία όμως είναι τοπική και όχι συνολική και η
οποία δεν έχει καμία σχέση με την συνολική count. Οποιαδήποτε αναφορά στην count μέσα στην func2( ) δεν
επιφέρει καμία αλλαγή στην εξωτερική count. Αν
ξεχάσουμε αυτόν τον περιορισμό το πρόγραμμα μπορεί να αντιδράσει περίεργα ακόμη
κι αν αυτό φαίνεται σωστό.
Η αποθήκευση των γενικών μεταβλητών
γίνεται σε ένα καθορισμένο τμήμα της μνήμης το οποίο δεσμεύεται από τον compiler για αυτό το σκοπό. Οι γενικές
μεταβλητές είναι πολύ χρήσιμες καθώς τα ίδια δεδομένα χρησιμοποιούνται από
πολλές συναρτήσεις μέσα στο πρόγραμμα.
Τα κυριότερα προβλήματά τους είναι:
i)
Πιάνουν αρκετό χώρο μνήμης γιατί χρησιμοποιούνται σε
όλη την εκτέλεση του προγράμματος και όχι όταν χρειάζονται.
ii)
Χρησιμοποιώντας μία γενική μεταβλητή κάνουμε μία
συνάρτηση λιγότερο αποδοτική γιατί αυτή πλέον στηρίζεται σε κάτι το οποίο δεν
είναι δηλωμένο μέσα της.
iii)
Η χρήση πολλών global variables οδηγεί σε
σφάλματα κυρίως unknown ή unwanted. Αυτό συμβαίνει στην BASIC όπου όλες οι μεταβλητές
είναι global.
Ένα σοβαρό πρόβλημα στην ανάπτυξη μεγάλων εφαρμογών
είναι η αναπόφευκτη αλλαγή της τιμής μίας μεταβλητής εξαιτίας της χρήσης της
κάπου αλλού. Αυτό συμβαίνει στην C εάν οι μεταβλητή είναι δηλωμένη global.
Το κυριότερο σημείο μίας δομημένης γλώσσας είναι η
τμηματοποίηση κώδικα και δεδομένων. Στην C αυτό κατορθώνεται με τη χρήση
τοπικών μεταβλητών και συναρτήσεων.
Οι σταθερές στην C είναι τιμές οι οποίες δεν αλλάζουν
κατά τη διάρκεια του προγράμματος. Μπορούν να είναι οποιουδήποτε τύπου. Η C
υποστηρίζει ακόμα ένα τύπο σταθεράς εκτός από τους προκαθορισμένους, αυτός
είναι ο τύπος string. Όλες οι
σταθερές τύπου string
περικλείονται από “ “ . Δεν πρέπει να
γίνεται σύγχυση των string με τα char. Μία απλή char σταθερά
περικλείεται από ‘ ‘ , (π.χ. ‘α’). Στην
ουσία τα string
είναι arrays
of characters.
Το κλείσιμο χαρακτήρων μέσα σε single quotes, “δουλεύει” για τους περισσότερους εκτυπώσιμους χαρακτήρες,
αλλά μερικοί όπως το return, το bell, κτλ, δε μπορούν να εισαχθούν από το πληκτρολόγιο.
Για αυτούς η C δεσμεύει τους λεγόμενους backslash codes.
|
Code \b \n \r \t \” \, \0 \\ \v \a \o \x |
Έννοια Backspace New Line Carriage Return Horizontal Tab Double Quotation Marks Single Quotation Marks Null Backslash Vertical Tab Alert Octal Constant Hex Constant |
Χρησιμοποιούμε τους backslash codes ακριβώς με τον ίδιο τρόπο που χρησιμοποιούμε και τους
άλλους χαρακτήρες.
Π.χ.
ch=”\t”;
printf(“This is a test
\n”);
Όπου πρώτα
μεταδίδεται ένα tab στην ch και μετά τυπώνεται ένα string ακολουθούμενο από νέα γραμμή.
Η C διαθέτει αρκετούς ενσωματωμένους
τελεστές. Ένας τελεστής οδηγεί τον compiler στην
εκτέλεση συγκεκριμένων λογικών ή μαθηματικών χειρισμών. Οι κύριοι είναι:
|
- + * / % -- ++ |
Αφαίρεση,
αποκλειστικό μείον Πρόσθεση Πολλαπλασιασμός Διαίρεση Υπόλοιπο
διαίρεσης (Modulo Division) Μείωση Αύξηση |
-
Όταν χρησιμοποιούμε το / σε μία διαίρεση integer ή character το υπόλοιπο στρογγυλοποιείται (trunc).
Π.χ. 10/3=3 integer division
-
Επίσης ο τελεστής % χρησιμοποιείται όπως το MOD σε άλλες γλώσσες. Ο
τελεστής % δε μπορεί να χρησιμοποιηθεί με FLOAT ή DOUBLE
τύπους.
Αύξηση και
μείωση
Δύο πολύ χρήσιμοι τελεστές στη C, οι
οποίοι δε χρησιμοποιούνται γενικά από άλλες γλώσσες προγραμματισμού είναι οι ++
και --. Ο τελεστής ++ προσθέτει 1 στον τελεστέο του, ενώ ο – αφαιρεί 1. Για
παράδειγμα:
x=x+1; είναι το ίδιο με ++x;
x=x-1; είναι το ίδιο με --x;
Και οι δύο τελεστές αυτοί μπορούν να
προηγούνται ή να ακολουθούν τον τελεστέο. Πχ το:
x=x+1; μπορεί να γραφτεί και ++x; και x++;
Πάντως υπάρχει διαφορά όταν αυτοί οι
τελεστές χρησιμοποιηθούν μέσα σε εκφράσεις. Η διαφορά έγκειται στο εξής:
-
Όταν ο τελεστής προηγείται του τελεστέου η C εκτελεί
την αύξηση (ή τη μείωση) πριν χρησιμοποιήσει την τιμή του τελεστέου.
-
Αν ο τελεστής ακολουθεί τον τελεστέο, τότε η C πρώτα
χρησιμοποιεί την τιμή του τελεστέου και κατόπιν εκτελεί την ενέργεια της
αύξησης (ή της μείωσης).
Π.χ.
x=10; To
y=11;
y=++x;
& x=11
x=10; To
y=10;
y=x++;
& x=11
Έχουμε
σοβαρά πλεονεκτήματα όταν μπορούμε να ελέγξουμε πότε η αύξηση ή μείωση
λαμβάνουν χώρα.
Η προτεραιότητα των αριθμητικών
τελεστών έχει ως εξής:
|
Υψηλότερη Χαμηλότερη |
++ -- - (unary
minus) * /
% + - |
Οι
τελεστές της ίδιας προτεραιότητας υπολογίζονται από τον compiler από τα αριστερά προς τα
δεξιά. Φυσικά μπορούν να χρησιμοποιηθούν για να αλλάξουν την κατάσταση της
ιεραρχίας.
(2) ΣΧΕΣΙΑΚΟΙ
ΚΑΙ ΛΟΓΙΚΟΙ ΤΕΛΕΣΤΕΣ
Οι
σχεσιακοί τελεστές αναφέρονται σε σχέσεις που μπορούν να υπάρχουν μεταξύ των
αξιών. Οι λογικοί τελεστές αναφέρονται στους τρόπους με τους οποίους οι ανωτέρω
σχέσεις μπορούν να συνδέονται χρησιμοποιώντας τους κανόνες της κοινής λογικής.
Το κλειδί
στα σύνολα των σχεσιακών και λογικών τελεστών είναι η ιδέα του True και False. Στη C True είναι κάθε τιμή διάφορη του 0. Το 0 είναι False. Εκφράσεις που χρησιμοποιούν σχεσιακούς και λογικούς
τελεστές θα επιστρέψουν 0 αντί για False και 1 για
True. Ο πίνακας αληθείας των
λογικών τελεστών είναι:
|
p |
q |
p AND q |
p OR q |
NOT p |
|
0 |
0 |
0 |
0 |
1 |
|
0 |
1 |
0 |
1 |
1 |
|
1 |
1 |
1 |
1 |
0 |
|
1 |
0 |
0 |
1 |
0 |
|
Σχεσιακοί Τελεστές > >= < <= == != |
Ενέργεια Μεγαλύτερο Μεγαλύτερο ή ίσο Μικρότερο Μικρότερο ή ίσο Ίσο Διάφορο |
|
Λογικοί Τελεστές && ! |
Ενέργεια AND Λογική Σύζευξη OR Λογική
Διάζευξη NOT Λογική Άρνηση |
|
ΙΕΡΑΡΧΙΑ ΣΧΕΣΙΑΚΩΝ ΚΑΙ ΛΟΓΙΚΩΝ
ΤΕΛΕΣΤΩΝ |
|
|
! >, >=, <, <= ==, != && |
Υψηλότερη Χαμηλότερη |
Και οι σχεσιακοί και οι λογικοί τελεστές
ιεραρχούνται κάτω από τους αριθμητικούς.
Π.χ.
μία έκφραση όπως:
10>1+12
εξηγείται σαν 10>(1+12) και
φυσικά επιστρέφει False.
Π.χ. 10>5 && !(10<9)
3<=4
Έχουμε : 10 > 5 επιστρέφει
1.
10 <
9 επιστρέφει 0.
3 <=4
επιστρέφει 1.
Άρα η παραπάνω έκφραση
διαμορφώνεται : 1 && !0 || 1, όμως το !0 επιστρέφει 1, άρα η έκφραση
διαμορφώνεται : 1 && 1 || 1
Με δεδομένο, ότι οι εκφράσεις
εκτελούνται από αριστερά προς τα δεξιά και με βάση την ιεραρχία των τελεστών
έχουμε 1 &&1 || 1 = 1 || 1 = 1.
Άρα True!!!
Όπως στις αριθμητικές, έτσι και στις
σχεσιακές ή λογικές εκφράσεις, χρησιμοποιούμε τις παρενθέσεις για να επιτύχουμε
την αλλαγή της ιεραρχίας.
Π.χ.
!1&&0 επιστρέφει False γιατί το ! ιεραρχείται πρώτο και μετά το AND
Ενώ:
!(1&&0) επιστρέφει True.
Υπενθυμίζουμε ότι όλες οι σχεσιακές
και λογικές προτάσεις επιστρέφουν 0 ή 1.
Π.χ.
int=x; Το πρόγραμμα αυτό τυπώνει τον
αριθμό 1 στην
x=100;
οθόνη,
printf(“%d”,x>10); γιατί
η σχεσιακή έκφραση είναι True.
(3) ΔΥΑΔΙΚΟΙ
ΤΕΛΕΣΤΕΣ (BITWISE OPERATORS)
Αντίθετα από άλλες γλώσσες η C υποστηρίζει ένα πλήρες
συμπλήρωμα δυαδικών τελεστών. Εφόσον η C σχεδιάστηκε να πάρει τη θέση της ASSEMBLY θα έπρεπε να έχει τη δυνατότητα
να εκτελέσει τις περισσότερες πράξεις που υποστηρίζει η ASSEMBLY. Δυαδικές πράξεις είναι ο
έλεγχος, η τοποθέτηση και η μετακίνηση των ενεργών bit μέσα σε ένα byte ή word, οι οποίες ταιριάζουν στους τύπους char και int. Οι
δυαδικές πράξεις δε μπορούν να εκτελεστούν με τους τύπους:
Float, double, long
double και void ή με άλλους πιο πολύπλοκους τύπους.
Τα δυαδικά NOT, OR και AND έχουν τον ίδιο πίνακα αληθείας με τα λογικά τους
ισοδύναμα με μόνη διαφορά ότι εργάζονται σε επίπεδο bit-to-bit. Ο πίνακας αληθείας του αποκλειστικού OR (XOR) είναι:
|
p |
q |
p^q |
|
0 |
0 |
0 |
|
1 |
0 |
1 |
|
1 |
1 |
0 |
|
0 |
1 |
1 |
Όπως δείχνει ο πίνακας το αποτέλεσμα
του XOR είναι TRUE μόνο όταν ένας (μόνο ένας) από τους τελεστέους είναι
αληθής. Αλλιώς είναι FALSE.
Οι δυαδικοί τελεστές βρίσκουν
εφαρμογή κυρίως σε προγραμματισμό device
drivers,
επικοινωνίες συσκευών (modem),
ρουτίνες αρχείων (δυαδικών) και αυτό γιατί υποστηρίζουν bits όπως το parity
bit (parity bit είναι το high order bit το οποίο
ελέγχει αν τα υπόλοιπα bit στο byte έχουν υποστεί αλλαγές).
Το δυαδικό AND κυρίως χρησιμοποιείται για την τοποθέτηση ενός
συγκεκριμένου bit σε
κατάσταση off.
|
Τελεστής & ^ ~ >> << |
Ενέργεια AND OR Αποκλειστικό
OR (XOR) NOT Δεξιά
ολίσθηση Αριστερή
ολίσθηση |
Π.χ.
Το παρακάτω παράδειγμα χρησιμοποιεί
τη συνάρτηση read_modem( ) και τοποθετεί το parity bit στο 0.
char ch;
ch=read_modem(
);
return(ch & 127);
To parity είναι το
8o bit το οποίο με τη χρήση του AND τοποθετεί το 0, σε ένα byte όπου τα 7 πρώτα bit είναι 1 και το 8o 0.
Η έκφραση ch & 127 σημαίνει εκτέλεση της AND μεταξύ του ch
και του 127. Το καθαρό αποτέλεσμα είναι ότι το 8o bit του ch τοποθετείται στο 0. Στο παρακάτω παράδειγμα
υποθέτουμε ότι το ch λαμβάνει
σαν τιμή τον χαρακτήρα ‘A’ και χρησιμοποιεί
parity bit.
1
1 0 0
0 0 0
1 Χαρ. ‘A’ με parity
bit το 127 στο δυαδικό
0
1 1 1
1 1 1
1 Εκτέλεση
δυαδικού AND
&
0
1 0 0
0 0 0
1 Χαρ.
‘A’ χωρίς parity bit
Το δυαδικό OR σαν αντίθετο του AND, χρησιμοποιείται για να θέτει τα bit σε κατάσταση on. Κάθε bit τοποθετημένο στο 1 σε κάθε
τελεστέο θα προκαλέσει την τοποθέτηση στο 1 του ανάλογου bit στη μεταβλητή.
Π.χ.
128
3 :
1
0 0 0
0 0 0
0 Δυαδικό 128
0
0 0 0
0 0 1
1 3 Δυαδικό
bitwise OR
1
0 0 0
0 0 1
1 Αποτέλεσμα
Ένα αποκλειστικό OR (XOR) θα θέσει
ένα bit σε κατάσταση on, μόνο αν τα δύο συγκρινόμενα bit είναι διαφορετικά.
Π.χ.
127^120:
0
1 1 1
1 1 1 1 127
Δυαδικό
0
1 1 1
1 0 0 0 120
Δυαδικό
^ bitwise XOR
0
0 0 0
0 1 1
1 Αποτέλεσμα
Σε γενικές γραμμές τα δυαδικά AND, OR
και XOR εφαρμόζουν
τις ενέργειές τους κατ’ ευθείαν σε κάθε bit της μεταβλητής. Γι’ αυτό το λόγο οι δυαδικοί τελεστές
δε χρησιμοποιούνται σε δηλώσεις συνθηκών με τον ίδιο τρόπο που χρησιμοποιούνται
οι λογικοί τελεστές. Για παράδειγμα:
Εάν x = 7 τότε
x && 8 = True (1) ενώ
x & 8 = False (0).
Σημειώνεται ότι οι δυαδικοί τελεστές
παράγουν αυθαίρετες τιμές σε συμφωνία φυσικά με τη συγκεκριμένη ενέργεια. Μ’
άλλα λόγια παράγουν και τιμές διάφορες του 0 και 1.
Shift Operators (Τελεστές Ολίσθησης)
Οι τελεστές ολίσθησης μετακινούν όλα
τα bit σε μία μεταβλητή αριστερά
ή δεξιά όπως δηλώνεται. Η κύρια φόρμα δήλωσης είναι:
variable > > no of bits
variable
< < no of bits
Καθώς τα bit ολισθαίνουν προς μία πλευρά, μηδενικά εμφανίζονται
στην άλλη. Η ολίσθηση δε σημαίνει κύλιση. Τα bit που ολισθαίνουν στην άκρη χάνονται για πάντα και δε μπορούν
να επαναφερθούν.
Οι τελεστές ολίσθησης
χρησιμοποιούνται κυρίως στην εκσφαλμάτωση εισόδων εξωτερικών συσκευών, διάβασμα
status information, αλλά και στην εκτέλεση γρήγορων
πολλαπλασιασμών και διαιρέσεων ακεραίων. Μία ολίσθηση δεξιά πολλαπλασιάζει έναν
ακέραιο με το 2, ενώ μία ολίσθηση αριστερά τον διαιρεί δια 2.
(4) ΤΡΙΑΔΙΚΟΣ
ΤΕΛΕΣΤΗΣ ? (TERNARY OPERATOR)
H C διαθέτει έναν ισχυρό τελεστή ο οποίος χρησιμοποιείται για
να υποκαταστήσει δηλώσεις του τύπου if-else. Η κύρια φόρμα του τριαδικού τελεστή είναι:
Exp1 ? Exp2 : Exp3
όπου Exp1, Exp2 και Exp3 είναι εκφράσεις. Ο τελεστής ? λειτουργεί ως εξής:
Εκτελείται
η έκφραση Exp1. Αν
είναι αληθής τότε εκτελείται η έκφραση Exp2 αλλιώς εκτελείται η Exp3.
Π.χ.
x=10;
y=x>9 ?
100 : 200;
Σ’ αυτό το παράδειγμα η y θα πάρει την τιμή 100. Αν ο
x ήταν 9 η y θα έπαιρνε την τιμή 200. Με if και else
θα γραφόταν ως εξής:
x=10;
if (x>9) y = 100;
else y = 200 ;
(5) ΤΕΛΕΣΤΕΣ ΔΕΙΚΤΩΝ ΜΝΗΜΗΣ (POINTER OPERATORS)
Ένας pointer είναι η διεύθυνση μνήμης
μιας μεταβλητής. Μία μεταβλητή τύπου pointer είναι μία
μεταβλητή η οποία έχει δηλωθεί για να κρατά έναν pointer. Οι pointers έχουν δύο
βασικούς τρόπους χρήσης στη C.
1.
Παρέχουν γρήγορη αναφορά σε στοιχεία πινάκων.
2.
Επιτρέπουν στις συναρτήσεις της C να τροποποιούν τις
καλούμενες παραμέτρους.
Ο Pointer Τελεστής
& (Address)
Είναι ένας μονοσήμαντος τελεστής ο
οποίος επιστρέφει τη διεύθυνση μνήμης του τελεστέου του.
Π.χ.
m=&count;
Τοποθετεί στην m τη διεύθυνση μνήμης της count. Υπενθυμίζεται ότι η ανωτέρω πράξη δεν έχει καμία επίπτωση
στην αξία της count. Απλά
αναφέρεται στη θέση όπου την έχει τοποθετήσει ο υπολογιστής στη μνήμη. Αν
υποθέσουμε ότι ο η/υ έχει τοποθετήσει την count στη θέση ΑΒ25 τότε η m θα πάρει αυτή την τιμή.
Ο Pointer Τελεστής * (At Address)
At Address)
Ο τελεστής αυτός είναι το συμπλήρωμα
του &. Είναι ένας μονοσήμαντος τελεστής ο οποίος επιστρέφει την τιμή της
μεταβλητής η οποία βρίσκεται στη διεύθυνση μνήμης η οποία τον ακολουθεί.
Π.χ.
Αν η m περιέχει τη διεύθυνση μνήμης της μεταβλητής count τότε η έκφραση:
q=*m
θα
τοποθετήσει την τιμή της count στην q.
Αν π.χ. η count=100 τότε και q=100.
Σ’ αυτή
την περίπτωση μπορούμε να πούμε ότι η q παίρνει
την τιμή της διεύθυνσης m.
Παρεμπιπτόντως το σύμβολο του
πολλαπλασιασμού (*) και ο τελεστής * είναι ίδια, καθώς επίσης και ο δυαδικός
τελεστής & και ο pointer τελεστής
&. Οι τελεστές αυτοί δεν έχουν καμία σχέση μεταξύ τους. Οι pointer τελεστές ιεραρχούνται ανώτερα από
όλους τους αριθμητικούς, εκτός από τον μονοσήμαντο ‘-‘ όπου είναι ίσοι.
Οι μεταβλητές που περιέχουν pointer πρέπει να δηλώνονται ανάλογα.
Δηλώνονται με ένα * στην αρχή της μεταβλητής για να ξεκαθαρίζει ο compiler ότι θα κρατήσει έναν pointer γι’ αυτό τον τύπο μεταβλητής.
Π.χ. για να δηλώσουμε μία μεταβλητή char
pointer η οποία
θα λέγεται ch θα
γράψουμε:
char *ch;
Εδώ η ch δεν είναι χαρακτήρας αλλά ένας pointer σε χαρακτήρα. Υπάρχει μεγάλη διαφορά. Ο τύπος δεδομένων που
θα δείχνει ο pointer
ονομάζεται βασικός τύπος του pointer.
Σε γενικές γραμμές η μεταβλητή pointer είναι μία μεταβλητή η οποία θα
χρησιμοποιηθεί για να τοποθετηθεί η διεύθυνση ενός αντικειμένου του βασικού
τύπου. Είναι βασικό να θυμόμαστε ότι ένας pointer πρέπει να χρησιμοποιείται για να δείχνει, μόνο σε δεδομένα
που έχουν τύπο το βασικό τύπο του δείκτη.
Μπορούμε να αναμίξουμε μαζί και pointer και μάκρο μεταβλητές κατά τη
διάρκεια της δήλωσης.
Π.χ.
int x,
*c, count;
Αυτό το παράδειγμα
δηλώνει την x και την count σαν ακεραίους ενώ το c σαν pointer
με βασικό τύπο ακέραιο.
Στο παρακάτω παράδειγμα οι τελεστές
* και & χρησιμοποιούνται για να τοποθετήσουν την τιμή 10 σε μία μεταβλητή,
την target.
Π.χ.
main(
)
{
int target, source;
int *m;
source=10;
m=&source;
target=*m;
}
(6) ΤΕΛΕΣΤΗΣ
ΧΡΟΝΟΥ ΜΕΤΑΦΡΑΣΗΣ (Compile-Time) sizeof
Είναι ένας
τελεστής ο οποίος επιστρέφει το μέγεθος σε bytes μιας μεταβλητής ή ενός τύπου μεταβλητής που έχουμε σε
παρένθεση.
Π.χ. float f;
printf(“%f”, sizeof f); Αυτό
θα μας δείξει
printf(“%d”, sizeof (int)); 4 και 2
Σημειώνεται
ότι για να υπολογιστεί το μέγεθος ενός τύπου πρέπει να περικλείεται το όνομα του
τύπου σε παρενθέσεις. Αυτό δεν είναι απαραίτητο για ονόματα μεταβλητών.
Κυρίως ο τελεστής sizeof χρησιμοποιείται για τον
υπολογισμό του μεγέθους σύνθετων τύπων δεδομένων όπως records κτλ, βοηθάει επίσης στη μεταφερσιμότητα του κώδικα της C.
(7) ΤΕΛΕΣΤΗΣ , (COMMA
OPERATOR)
Ο τελεστής ,
χρησιμοποιείται στην ανανέωση διαφόρων εκφράσεων. Η αριστερή πλευρά του
τελεστή πάντα χαρακτηρίζεται σαν void. Αυτό
σημαίνει ότι η δεξιά πλευρά είναι αυτή που καθορίζει την τιμή της συνολικής
έκφρασης.
Π.χ.
x = (y=3, y+1);
Πρώτα αποδίδουμε στο y την τιμή 3 και τέλος αποδίδουμε στο x την τιμή 4. Οι παρενθέσεις είναι απαραίτητες ενώ ο
τελεστής , έχει χαμηλότερη ιεράρχηση από το =.
y=10;
x=(y=y-5 , 25/y);
Μετά την εκτέλεση ,
το x θα έχει
την τιμή 5 επειδή η πραγματική τιμή του y μειώνεται κατά 5 και έπειτα διαιρεί το 25 σαν
αποτέλεσμα.
Ο τελεστής ,
έχει την έννοια του “και” σε μία φράση της καθομιλουμένης, σα να λέμε
“κάνε αυτό και αυτό”.
(8) ΤΕΛΕΣΤΗΣ . (DOT) ΚΑΙ
-> (ARROW)
Οι τελεστές .
και -> χρησιμοποιούνται για
την αναφορά σε ατομικά στοιχεία structures και unions. Τα structures και τα unions είναι σύνθετοι τύποι δεδομένων οι οποίοι μπορούν να
αναφερθούν με ένα μόνο όνομα.
Ο τελεστής τελεία χρησιμοποιείται
όταν η δομή ή το union είναι global ή όταν η δήλωσή τους είναι στο ίδιο τμήμα με τον
κώδικα στον οποίο αναφέρονται. Ο τελεστής -> χρησιμοποιείται όταν έχουμε
έναν pointer στη δομή
ή το union.
Π.χ.
struct emp
{
char
name[80];
int
age;
float wage;
}
Για να αποδώσουμε την τιμή 123.23
στο στοιχείο wage της δομής
emp πρέπει να γράψουμε:
emp.wage = 123.23;
(9) ΑΓΚΥΛΕΣ [ ] ΚΑΙ
ΠΑΡΕΝΘΕΣΕΙΣ ( )
Στη C οι παρενθέσεις αυξάνουν την
ιεραρχία των τελεστών που βρίσκονται μέσα τους.
Οι αγκύλες ορίζουν δείκτες πινάκων.
Όταν έχουμε πίνακα, η έκφραση μέσα στις αγκύλες μας δίνει τον δείκτη του
πίνακα.
Π.χ.
char s[80];
main(
)
{
s[3] = ‘a’;
printf(“%c”, s[3]);
}
Πρώτα δίνουμε την τιμή ‘a’ στο τέταρτο στοιχείο του πίνακα s μετά το τυπώνουμε. Υπόψη
ότι στη C το πρώτο στοιχείο του πίνακα είναι το 0.
Υψηλότερη ( ) [ ]
-> .
! ~ ++ -(unary) *
& sizeof
* / %
+ -
<<
>>
< <= > >=
== !=
&
^
&&
?
= +=
-= *= /=
Χαμηλότερη )
Είναι ο συνδυασμός μεταξύ τελεστών
και τελεστέων μέσα σε μία πρόταση.
Τελεστές, σταθερές και μεταβλητές
είναι τα συστατικά των εκφράσεων. Μία έκφραση στη C είναι κάθε σωστός συνδυασμός
αυτών των πραγμάτων.
ΜΕΤΑΤΡΟΠΗ ΤΥΠΩΝ ΣΤΙΣ ΕΚΦΡΑΣΕΙΣ
Όταν σταθερές και μεταβλητές
διαφορετικών τύπων αναμιγνύονται σε μία έκφραση μετατρέπονται στον ίδιο τύπο. Η
C μετατρέπει όλους τους τελεστέους στον τύπο του μεγαλύτερου τελεστέου.
Οι κανόνες είναι:
1)
Όλοι οι char και short int μετατρέπονται σε int. Όλοι οι float σε double.
2)
Όλα τα ζεύγη τελεστέων μετατρέπονται σε long double αν ένας από αυτούς είναι long double.
Αλλιώς αν
ένας είναι double, όλοι
μετατρέπονται σε double.
Αλλιώς αν
ένας είναι long, όλοι
μετατρέπονται σε long.
Αλλιώς αν
ένας είναι unsigned, όλοι
μετατρέπονται σε unsigned.
Εφόσον αναφέρθηκαν αυτοί οι κανόνες
κάθε ζεύγος τελεστέων είναι του ίδιου τύπου και το αποτέλεσμα όλων των πράξεων
είναι ίδιο με των τελεστέων.
Στο παρακάτω παράδειγμα το ch γίνεται integer και το f μετατρέπεται σε double. Το ch/I γίνεται double γιατί το f * d είναι double και τέλος
το όλο αποτέλεσμα είναι double.
Η λογική της μετατροπής τύπων
δεδομένων στην C είναι ότι η C μετατρέπει όλη την έκφραση στον τύπο του
μεγαλύτερου τελεστέου. Εάν για παράδειγμα προσθέτουμε μία μεταβλητή τύπου char η όλη έκφραση θα μετατραπεί σε float.
Π.χ.
char ch;
int
i;
float
f;
double
d;
result
= (ch/ i) + ( f
* d ) – ( f
+ d );
η έκφραση ch/i
θα επιστρέψει int, διότι ο
τελεστέος I, είναι integer και άρα μεγαλύτερος (σε
απαιτούμενο χώρο μνήμης) συγκριτικά με τον ch που είναι char.
η έκφραση f*d θα
επιστρέψει double.
η έκφραση f+d θα
επιστρέψει double.
Άρα έχουμε : int + double – double.
Όπως ήδη
γνωρίζουμε οι εκφράσεις εκτελούνται από αριστερά προς τα δεξιά και ως εκ τούτου
έχουμε :
int + double = double, Έτσι η παραπάνω έκφραση διαμορφώνεται : double – double = double.
Άρα η έκφραση επιστρέφει double.
Είναι
δυνατό να αναγκάσουμε μία έκφραση να είναι ενός συγκεκριμένου τύπου
χρησιμοποιώντας μία δομή η οποία ονομάζεται cast είναι:
(type) Expression
όπου type είναι ένας από τους standard τύπους της C.
Π.χ. Αν θέλουμε να σιγουρέψουμε ότι η έκφραση x / 2 θα είναι τύπου float γράφουμε:
(
float ) x / 2
Συνήθως
τα casts θεωρούνται τελεστές. Σαν
τελεστές είναι μονοσήμαντοι και έχουν την ίδια θέση στην ιεραρχία με τους
άλλους μονοσήμαντους τελεστές.
Παρ’
όλα αυτά τα cast δε
χρησιμοποιούνται και τόσο στον προγραμματισμό εκτός από λίγες περιπτώσεις που
μπορούν να φανούν χρήσιμα.
Π.χ.
main ( )
{
int i;
for (i = 1 ; i <= 100 ; ++i)
printf (“%d/2 is : %f”, i, (float) i/2);
}
Στο
παραπάνω παράδειγμα χρησιμοποιούμε τη μεταβλητή σαν δείκτη της for. Αυτή είναι int μεταβλητή. Όμως θέλουμε να την διαιρούμε δια 2 και να
παίρνουμε και κλασματικό μέρος από την διαίρεση. Αν δεν είχαμε χρησιμοποιήσει cast θα είχαμε μία απλή ακέραια διαίρεση. Ενώ τώρα που
ορίζουμε το αποτέλεσμα σαν float θα
εκτυπωθεί και το δεκαδικό μέρος της διαίρεσης.
Τα
κενά ανάμεσα σε εκφράσεις της C δεν έχουν κανένα αντίκτυπο.
Π.χ.
x=10/y~(127/x);
x = 10 / y ~ ( 127 / x ) ;
Οι δύο αυτές εκφράσεις είναι
ίδιες.
Οι παρενθέσεις πρέπει να χρησιμοποιούνται
ακόμα και αν δεν χρειάζονται για να αυξάνουν την αναγνωσιμότητα του κώδικα. Δεν
προκαλούν μείωση στην ταχύτητα.
ΣΥΝΤΟΜΟΓΡΑΦΙΕΣ
(SHORTHAND) ΣΤΗ C
Η
C διαθέτει συντομογραφίες οι οποίες απλουστεύουν τον κώδικα.
Π.χ.
η έκφραση x=x+10; μπορεί να γραφτεί σαν x+=10;
Το
ζεύγος των τελεστών += οδηγεί τον compiler να
αυξήσει το x κατά 10.
Οι
συντομογραφίες αυτές δουλεύουν για όλους τους δυαδικούς τελεστές της C. Η
σύνταξη είναι:
var = var
operator expression
Είναι ίδιο με: var
operator = expression
Π.χ.: x=x-100; Π.χ.: x=x+1;
x-=100; x+=1;
x++