Ορισμοί Μακροεντολών |
Ο ορισμός μιάς μακροεντολής είναι επιφανειακά ίδιος με τον ορισμό μιάς σταθεράς. Έχουμε πάλι δύο συμβολοσειρές όπου η πρώτη αποτελεί συνώνυμο της δεύτερης και ο μεταφραστής προβαίνει στις σχετικές αντικαταστάσεις κατά την μετάφραση του προγράμματος. Ορισμοί μακροεντολών είναι οι δύο τελευταίες εντολές #define του προγράμματος. Η διαφορά του ορισμού σταθεράς και μακροεντολής γίνεται κατανοητή από το επόμενο παράδειγμα. Με βάση τον πρώτο ορσιμό μακροεντολής η πρόταση mx = MAX(index,count) του προηγούμενου προγράμματος (DEFINE.C) αντικαθίσταται από την πρόταση mx = ((index)>(count)?(index):(count)). Τι έχει συμβεί; Η πρώτη συμβολοσειρά του ορισμού περιέχει το όνομα της μακροεντολής, MAX, συνοδευόμενο από ένα ζέυγος παρενθέσεων, μέσα στο οποίο υπάρχουν οι 'τυπικές παράμετροι' της μακροεντολής με ονόματα Α και Β. Οι τυπικές αυτές παράμετροι χρησιμοποιούνται στη δεύτερη συμβολοσειρά η οποία δεν είναι τίποτε άλλο από μιά εκτελέσιμη πρόταση της C, συγκεκριμένα μιά έκφραση υπό συνθήκη. Όταν ο μεταφραστής βρεί το όνομα της μακροεντολής τότε προσπαθεί να συνδέσει τις 'τυπικές παραμέτρους' της με αντίστοιχες 'πραγματικές παραμέτρους'. Αυτές οι πραγματικές παράμετροι χρησιμοποιούνται και στη δεύτερη συμβολοσειρά, δηλαδή στην εκτελέσιμη πρόταση. Το αποτέλεσμα του προγράμματος δίνεται αμέσως Max is 5 and min is 0 Max is 5 and min is 1 Max is 5 and min is 2 Max is 5 and min is 3 Max is 5 and min is 4 Max is 5 and min is 5 Max is 6 and min is 5 Max is 7 and min is 5 Max is 8 and min is 5 Max is 9 and min is 5 Όπως είναι φανερό το όνομα της μακροεντολής πρέπει να ακολουθείται αμέσως από τις παρενθέσεις, αλλοιώς ο ορισμός χάνει το νόημά του. Σημειώστε οτι τυχόν σχόλια ή μηνύματα δεν επηρρεάζονται από τη μακροεντολή. Σημειώστε τις πολλαπλές παρενθέσεις στον ορισμό της έκφρασης υπό συνθήκη. Η αναγκαιότητά τους εξηγείται αμέσως μετά. |
Λάθος μακροεντολές |
Το πρόγραμμα που είναι αποθηκευμένο στο αρχείο MACRO.C παρουσιάζει ορισμένους λανθασμένους ορισμούς μακροεντολών. Τα λάθη οφείλονται σε πλειμμελή χρήση των παρενθέσεων. Το πρόγραμμα περιέχει πέντε ορισμούς μακροεντολών, δύο γιά την ύψωση ενός αριθμού στη τρίτη δύναμη (λάθος και σωστό), έναν γιά ύψωση αριθμού στο τετράγωνο και δύο γιά τον διπλασιασμό ενός αριθμού (λάθος και σωστό). Γιά να γίνουν αντιληπτά τα λάθη στους ορισμούς ας δούμε τις αντικαταστάσεις που θα πραγματοποιήσει ο μεταφραστής στον πίνακα που ακολουθεί SQUR(i+offset) (i+offset)*(i+offset) CUBE(i+offset) (i+offset)*(i+offset)*(i+offset) WRONG(i+offset) i+offset*i+offset*i+offset 5*ADD_WRONG(i) 5*i+i 5*ADD_RIGHT(i) 5*(i+i) Είναι προφανές οτι τα λάθη οφείλονται στο γεγονός οτι στους λανθασμένους ορισμούς δεν έχουν ληφθεί υπόψη οι προτεραιότητες των αριθμητικών τελεστών. Αυτό γίνεται ακόμη πιό κατανοητό από το αποτέλεσμα της εκτέλεσης του προγράμματος που ακολουθεί. The square of 6 is 36, and its cube is 216 The wrong of 6 is 16 The square of 7 is 49, and its cube is 343 The wrong of 7 is 27 The square of 8 is 64, and its cube is 512 The wrong of 8 is 38 The square of 9 is 81, and its cube is 729 The wrong of 9 is 49 The square of 10 is 100, and its cube is 1000 The wrong of 10 is 60 The square of 11 is 121, and its cube is 1331 The wrong of 11 is 71 The square of 12 is 144, and its cube is 1728 The wrong of 12 is 82 Now try the addition macro's Wrong addition macro = 6, and right = 10 Wrong addition macro = 12, and right = 20 Wrong addition macro = 18, and right = 30 Wrong addition macro = 24, and right = 40 Wrong addition macro = 30, and right = 50 Wrong addition macro = 36, and right = 60 Wrong addition macro = 42, and right = 70 Γιά να αποφύγουμε τέτοια λάθη καλύτερα να βάζουμε λίγες παραπάνω παρενθέσεις στους ορισμούς μακροεντολών έτσι ώστε να αίρεται κάθε αμφισβήτηση. |
![]() |
![]() |
![]() |