Προγραμματισμός

Αξιολογήστε εκφράσεις Java με τελεστές

Οι εφαρμογές Java επεξεργάζονται δεδομένα αξιολογώντας εκφράσεις, που είναι συνδυασμοί γραμματοσειρών, μεθόδων κλήσεων, μεταβλητών ονομάτων και τελεστών. Η αξιολόγηση μιας έκφρασης συνήθως παράγει μια νέα τιμή, η οποία μπορεί να αποθηκευτεί σε μια μεταβλητή, να χρησιμοποιηθεί για τη λήψη απόφασης και ούτω καθεξής.

Σε αυτό το σεμινάριο, θα μάθετε πώς να γράφετε εκφράσεις για τα προγράμματα Java. Σε πολλές περιπτώσεις, θα χρησιμοποιήσετε τελεστές για να γράψετε τις εκφράσεις Java και υπάρχουν πολλές τύποι χειριστών να μάθω πώς να το χρησιμοποιήσω. Θα παρουσιάσω εν συντομία τους τύπους χειριστή της Java (συμπεριλαμβανομένων των τύπων πρόσθετου, bitwise, λογικής, υπό όρους, μετατόπισης και ισότητας) και τους τελεστές τους. Θα μάθετε επίσης για σημαντικές έννοιες, όπως υπερφόρτωση χειριστή και προτεραιότητα χειριστή και θα δείτε μια επίδειξη μετατροπής πρωτόγονου τύπου. Θα ολοκληρώσω με ένα μικρό πρόγραμμα Java που μπορείτε να χρησιμοποιήσετε για να εξασκηθείτε μόνοι σας σε πρωτόγονες μετατροπές.

λήψη Λήψη του κώδικα Λήψη του πηγαίου κώδικα για παράδειγμα εφαρμογές σε αυτό το σεμινάριο. Δημιουργήθηκε από τον Jeff Friesen για το JavaWorld.

Απλές εκφράσεις

ΕΝΑ απλή έκφραση είναι μια κυριολεκτική, μεταβλητή ονομασία ή μέθοδος κλήσης. Δεν εμπλέκονται χειριστές. Ακολουθούν ορισμένα παραδείγματα απλών εκφράσεων:

52 // integer literal age // μεταβλητό όνομα System.out.println ("ABC"); // μέθοδος κλήσης "Java" // συμβολοσειρά κυριολεκτικά 98.6D // διπλή ακρίβεια κυμαινόμενο σημείο 89L // μακρά ακέραιος

Μια απλή έκφραση έχει ένα τύπος, που είναι είτε πρωτόγονος τύπος είτε τύπος αναφοράς. Σε αυτά τα παραδείγματα, 52 είναι ακέραιος 32-bit (int); System.out.println ("ABC"); είναι άκυρο (κενός) επειδή δεν επιστρέφει καμία τιμή."Ιάβα" είναι μια συμβολοσειρά (Σειρά); 98.6D είναι μια τιμή κυμαινόμενου σημείου διπλής ακρίβειας 64-bit (διπλό); και 89L είναι ακέραιος αριθμός 64 bit (μακρύς). Δεν ξέρουμε ηλικίαο τύπος.

Πειραματισμός με jshell

Μπορείτε εύκολα να δοκιμάσετε αυτές και άλλες απλές εκφράσεις χρησιμοποιώντας jshell. Για παράδειγμα, εισάγετε 52 στο jshell> προτροπή και θα λάβετε κάτι σαν την ακόλουθη έξοδο:

$1 ==> 52

$1 είναι το όνομα ενός μεταβλητή μηδέν ότι jshell δημιουργεί για αποθήκευση 52. (Οι μεταβλητές Scratch δημιουργούνται όποτε εισάγονται τα γράμματα.) Εκτελέστε System.out.println ($ 1) και θα δεις 52 ως έξοδος.

Μπορείτε να τρέξετε jshell με την όρισμα γραμμής εντολών (jshell -v) για τη δημιουργία αναλυτικών σχολίων. Σε αυτήν την περίπτωση, εισάγοντας 52 θα είχε ως αποτέλεσμα το ακόλουθο μήνυμα, αποκαλύπτοντας αυτή τη μεταβλητή μηδέν $1 έχει int (32-bit ακέραιος) τύπος:

| δημιουργήθηκε μεταβλητή scratch $ 1: int

Στη συνέχεια, δοκιμάστε να εισαγάγετε ηλικία. Σε αυτήν την περίπτωση, πιθανότατα θα λάβετε ένα μήνυμα σφάλματος ότι το σύμβολο δεν βρέθηκε. Το Java Shell το υποθέτει αυτό ηλικία είναι μια μεταβλητή, αλλά δεν γνωρίζει τον τύπο της. Θα πρέπει να συμπεριλάβετε έναν τύπο. για παράδειγμα, δείτε τι θα συμβεί αν εισέλθετε int ηλικία.

Σύνθετες εκφράσεις

ΕΝΑ σύνθετη έκφραση αποτελείται από μία ή περισσότερες απλές εκφράσεις ενσωματωμένες σε μια μεγαλύτερη έκφραση μέσω ενός χειριστής, η οποία είναι μια ακολουθία οδηγιών που συμβολίζονται συμβολικά στον πηγαίο κώδικα. Ο τελεστής μετατρέπει την έκφρασή του τελεστής σε μια άλλη τιμή. Για παράδειγμα, στο 6 * 5, ο τελεστής πολλαπλασιασμού (*μετασχηματίζει τελεστές 6 και 5 σε 30.

Οι σύνθετες εκφράσεις μπορούν να συνδυαστούν σε μεγαλύτερες εκφράσεις. Για παράδειγμα, 6 * 5 + 10 παρουσιάζει σύνθετη έκφραση 6 * 5 και μια σύνθετη έκφραση που αποτελείται από το προϊόν τους, τον χειριστή προσθήκης +, και τον αριθμό 10. Η σειρά αξιολόγησης (πολλαπλασιάστε πρώτα και μετά προσθέστε) υπαγορεύεται από Java κανόνας προτεραιότητας, στο οποίο θα φτάσουμε σύντομα.

Οι σύνθετες εκφράσεις μπορούν επίσης να είναι απλές

6 * 5 είναι μια σύνθετη έκφραση που αποτελείται από δύο απλές εκφράσεις, 6 και 5. Αλλά 6 * 5 είναι επίσης μια απλή έκφραση από +Η προοπτική. ο + Ο χειριστής βλέπει μόνο το προϊόν του, 30, το οποίο είναι μια απλή έκφραση.

Χειριστές και τελεστές

Οι τελεστές της Java ταξινομούνται βάσει του αριθμού τελεστών τους:

  • ΕΝΑ unary χειριστής έχει έναν τελεστή, για παράδειγμα unary μείον (π.χ., -5).
  • ΕΝΑ δυαδικός χειριστής έχει δύο τελεστές, παραδείγματα είναι ο πολλαπλασιασμός και η προσθήκη.
  • ΕΝΑ τριαδικός χειριστής έχει τρεις τελεστές. ένα παράδειγμα είναι το υπό όρους χειριστής (?:).

Οι χειριστές της Java ταξινομούνται επίσης ανά θέση:

  • ΕΝΑ τελεστής προθέματος είναι ένας unary τελεστής που προηγείται του τελεστή του (π.χ., -5).
  • ΕΝΑ τελεστής postfix είναι ένας unary τελεστής που ακολουθεί τον τελεστή του (π.χ., ηλικία ++; - προσθέστε 1 στο ηλικίααριθμητική τιμή).
  • Ενα χειριστής infix είναι ένας δυαδικός ή τριμερής τελεστής μεταξύ των τελεστών του χειριστή (π.χ., ηλικία + 5).

Ένα άλλο παράδειγμα

Θα παρουσιάσω περισσότερους χειριστές στις ακόλουθες ενότητες, όπου θα παρουσιάσω παραδείγματα με τη μορφή εφαρμογών. Θα μπορούσατε επίσης να δοκιμάσετε αυτούς τους χειριστές με jshell, έτσι:

jshell> 6 + 2 $ 1 ==> 8 jshell> 7 * $ 1 $ 2 ==> 56

Σε αυτήν την περίπτωση, εισάγουμε πρώτα την έκφραση 6 + 2, οι οποίες jshell αξιολογεί, αναθέτοντας την προκύπτουσα μεταβλητή 8 στο μηδέν $1. Στη συνέχεια, πολλαπλασιάζουμε $1 με 7, η οποία αποθηκεύει 56 σε μηδενική μεταβλητή $2. Αυτό το παράδειγμα δείχνει ότι μπορείτε να χρησιμοποιήσετε μεταβλητές μηδέν σε εκφράσεις Java.

Υπερφορτωμένοι χειριστές

Ο τελεστής συν (+) είναι ένα παράδειγμα ενός υπερφορτωμένος χειριστής, ο οποίος είναι ένας χειριστής που εκτελεί μία από τις πολλές λειτουργίες που βασίζονται στο τύποι των τελεσίδων του. Ο τελεστής συν εκτελεί ακέραια προσθήκη όταν και οι δύο τελεστές είναι ακέραιοι, προσθήκη κυμαινόμενου σημείου όταν και οι δύο τελεστές είναι τιμές κυμαινόμενου σημείου και συνδυασμός συμβολοσειρών όταν και οι δύο τελεστές είναι συμβολοσειρές. Ο χειριστής μείον (-) είναι επίσης υπερφορτωμένος, εκτελώντας αφαίρεση ακέραιου ή κυμαινόμενου σημείου.

Τύποι χειριστή σε Java

Πρόσθετοι τελεστές

ο τελεστές πρόσθετων αύξηση ή μείωση αριθμητικής τιμής μέσω προσθήκης και αφαίρεσης. Οι τελεστές πρόσθετων περιλαμβάνουν την προσθήκη (+), αφαίρεση (-), postdecrement (--), μετά την αύξηση (++), προκαθορισμός (--), και προσαύξηση (++). Συνδυασμός χορδών (+θεωρείται επίσης πρόσθετο. Ακολουθεί ένας επίσημος ορισμός για καθέναν από αυτούς τους χειριστές:

  • Πρόσθεση: Δεδομένου τελεστής1 + τελεστής2, όπου κάθε τελεστής πρέπει να έχει χαρακτήρα ή αριθμητικό τύπο, προσθέστε τελεστής2 προς την τελεστής1 και επιστρέψτε το άθροισμα. Παράδειγμα: 4 + 6.
  • Αφαίρεση: Δεδομένου τελεστής1 - τελεστής2, όπου κάθε τελεστής πρέπει να έχει χαρακτήρα ή αριθμητικό τύπο, αφαιρέστε τελεστής2 από τελεστής1 και επιστρέψτε τη διαφορά. Παράδειγμα: 4 - 6.
  • Μετα-περιορισμός: Δεδομένου μεταβλητός--, όπου μεταβλητός πρέπει να είναι χαρακτήρα ή αριθμητικός τύπος, αφαίρεση 1 από μεταβλητόςτιμή (αποθήκευση του αποτελέσματος στο μεταβλητός) και επιστρέψτε την αρχική τιμή. Παράδειγμα: Χ--;.
  • Μετααύξηση: Δεδομένου μεταβλητός++, όπου μεταβλητός πρέπει να είναι χαρακτήρα ή αριθμητικός τύπος, προσθέστε 1 στο μεταβλητόςτιμή (αποθήκευση του αποτελέσματος στο μεταβλητός) και επιστρέψτε την αρχική τιμή. Παράδειγμα: x ++;.
  • Προκαθορισμός: Δεδομένου --μεταβλητός, όπου μεταβλητός πρέπει να είναι χαρακτήρα ή αριθμητικός τύπος, αφαίρεση 1 από την τιμή του, αποθήκευση του αποτελέσματος στο μεταβλητόςκαι επιστρέψτε τη νέα μειωμένη τιμή. Παράδειγμα: --Χ;.
  • Προαύξηση: Δεδομένου ++μεταβλητός, όπου μεταβλητός πρέπει να έχει χαρακτήρα ή αριθμητικό τύπο, να προσθέτει 1 στην τιμή του, να αποθηκεύει το αποτέλεσμα μεταβλητόςκαι επιστρέψτε τη νέα αυξημένη τιμή. Παράδειγμα: ++ x;.
  • Συνδυασμός συμβολοσειράς: Δεδομένου τελεστής1 + τελεστής2, όπου τουλάχιστον ένας τελεστής είναι Σειρά τύπος, προσάρτηση τελεστής2παράσταση συμβολοσειράς σε τελεστής1αναπαράσταση συμβολοσειράς και επιστροφή του αποτελέσματος. Παράδειγμα: "Α" + "Β".

Οι τελεστές προσθήκης, αφαίρεσης, μετα-περιορισμού, μετά-αύξησης, προκαθορισμού και προ-προσαύξησης μπορούν να δημιουργήσουν τιμές που υπερβαίνουν τα όρια του τύπου αποτελέσματος. Για παράδειγμα, η προσθήκη δύο μεγάλων θετικών ακέραιων τιμών 64-bit μπορεί να παράγει μια τιμή που δεν μπορεί να αναπαρασταθεί σε 64 bit. Η προκύπτουσα υπερχείλιση δεν εντοπίζεται ούτε αναφέρεται από τους τελεστές πρόσθετων της Java.

Ανίχνευση υπερχείλισης στην τυπική βιβλιοθήκη κλάσης Java

Η τυπική βιβλιοθήκη κατηγορίας Μαθηματικά Η κλάση περιλαμβάνει μεθόδους για τον εντοπισμό υπερχείλισης. Για παράδειγμα, int addExact (int x, int y) προσθέτει τις τιμές στο Χ και γ, επιστρέφοντας το άθροισμα ή ρίχνοντας μια εξαίρεση στην υπερχείλιση.

Παράδειγμα εφαρμογής: Τελεστές πρόσθετων

Η λίστα 1 παρουσιάζει μια μικρή εφαρμογή για παιχνίδι με τους χειριστές πρόσθετων της Java.

Λίστα 1. Τελεστές πρόσθετων σε Java (AddOp.java)

class AddOp {public static void main (String [] args) {System.out.println (125 + 463); System.out.println (2.0 - 6.3); int ηλικία = 65; System.out.println (ηλικία); System.out.println (ηλικία--); System.out.println (ηλικία ++); System.out.println (- ηλικία); System.out.println (++ ηλικία); System.out.println ("A" + "B"); }}

Μάθατε στο προηγούμενο σεμινάριο πώς να χρησιμοποιήσετε τα JDK javac εργαλείο για τη μεταγλώττιση του πηγαίου κώδικα Java και του Ιάβα εργαλείο για την εκτέλεση της εφαρμογής που προκύπτει. Εκτελέστε την ακόλουθη εντολή για να μεταγλωττίσετε την Καταχώριση 1:

javac AddOp.java

Υποθέτοντας την επιτυχή συλλογή, θα πρέπει να παρατηρήσετε ένα AddOp.class αρχείο στον τρέχοντα κατάλογο. Εκτελέστε την ακόλουθη εντολή για να την εκτελέσετε:

java AddOp

Προσθήκη αποκρίνεται παράγοντας την ακόλουθη έξοδο:

588 -4,3 65 65 64 64 65 ΑΒ

Η μελέτη αυτής της παραγωγής προσφέρει πληροφορίες σχετικά με τους τελεστές postincrement, postdecrement, preincrement και preecrement. Για postincrement / postdecrement, ηλικίαΗ τρέχουσα τιμή είναι έξοδος πριν από τη λειτουργία αύξησης / μείωσης. Για προ-αύξηση / προκαθορισμός, η λειτουργία εκτελείται και το αποτέλεσμα αποθηκεύεται στο ηλικία, και μετά ηλικίαΗ νέα τιμή είναι έξοδος.

Επανάληψη με χειριστές Java

Οι τελεστές πρόσθετων είναι ιδιαίτερα χρήσιμοι στο πλαίσιο ενός δήλωση επανάληψης, όπου χρησιμοποιούνται για να προχωρήσουν στην επόμενη επανάληψη. Θα μάθετε για τις δηλώσεις επαναλήψεων στον επόμενο οδηγό Java 101.

Χειριστής ευρετηρίου συστοιχιών

ο χειριστής ευρετηρίου συστοιχίας ([]) έχει πρόσβαση σε ένα στοιχείο πίνακα παρέχοντας το στοιχείο δείκτης (θέση). Αυτός ο τελεστής τοποθετείται μετά το όνομα της μεταβλητής πίνακα, όπως στο βαθμοί [0] (αποκτήστε πρόσβαση στο πρώτο στοιχείο του πίνακα που έχει ανατεθεί βαθμοί; το πρώτο στοιχείο αποθηκεύεται στο ευρετήριο 0). Ακολουθεί ένας επίσημος ορισμός:

Δεδομένος μεταβλητός[δείκτης], όπου δείκτης πρέπει να είναι ακέραιος (int) πληκτρολογήστε, διαβάστε μια τιμή ή αποθηκεύστε μια τιμή μεταβλητόςΣτοιχείο αποθήκευσης στην τοποθεσία δείκτης. Παράδειγμα: θερμοκρασίες [1]

Η τιμή μεταβιβάστηκε στο δείκτης είναι ένας ακέραιος αριθμός 32-bit που είναι 0 ή θετική τιμή που κυμαίνεται από ένα μικρότερο από το μήκος του πίνακα, το οποίο υποδεικνύεται με προσάρτηση .μήκος στο όνομα του πίνακα. Για παράδειγμα, βαθμοί. μήκος επιστρέφει τον αριθμό των στοιχείων στον πίνακα που έχει εκχωρηθεί βαθμοί.

Μεταβλητές συστοιχίας έναντι συστοιχιών

βαθμοί δεν είναι πίνακας, αλλά είναι μια μεταβλητή που περιέχει μια αναφορά σε μια περιοχή μνήμης που σχηματίζει τον πίνακα. Αυτό ισχύει για όλους τους πίνακες Java. Ωστόσο, είναι συμβατικό να αναφέρεται βαθμοί ή οποιαδήποτε μεταβλητή πίνακα ως πίνακας.

Παράδειγμα εφαρμογής: χειριστής ευρετηρίου Array

Η λίστα 2 παρουσιάζει τον πηγαίο κώδικα σε μια εφαρμογή που σας επιτρέπει να παίξετε με τον χειριστή ευρετηρίου συστοιχιών.

Λίστα 2. Διαχειριστής ευρετηρίου Array στην Java (ArrayIndexOp.java)

class ArrayIndexOp {public static void main (String [] args) {int [] βαθμοί = {89, 90, 68, 73, 79}; System.out.println (βαθμοί [1]); βαθμοί [1] = 91; System.out.println (βαθμοί [1]); int index = 4; System.out.println (βαθμοί [ευρετήριο]); System.out.println (βαθμοί ['C' - 'A']); // System.out.println (βαθμοί [1D]); }}

Η Λίστα 2 είναι κάπως πιο ενδιαφέρουσα από την Καταχώριση 1. Μετά τη δημιουργία ενός πενταμελούς, μονοδιάστατου πίνακα ακεραίων (μέσω ενός αρχικοποιητή πίνακα) και την ανάθεση της αναφοράς του πίνακα σε βαθμοί, κύριος() προχωρά σε πρόσβαση σε διάφορα στοιχεία. Δύο είδη έχουν ιδιαίτερο ενδιαφέρον:

  • Το ευρετήριο του χειριστή ευρετηρίου πίνακα πρέπει τελικά να είναι ακέραιος 32-bit (0 ή θετική τιμή). Μπορείτε να καθορίσετε το όνομα μιας ακέραιας μεταβλητής (π.χ., δείκτης), η οποία περιέχει την τιμή ευρετηρίου, ως ευρετήριο.
  • Μπορείτε να καθορίσετε έναν υπολογισμό που περιλαμβάνει γράμματα χαρακτήρων. (Αργότερα σε αυτό το σεμινάριο θα παρουσιάσω μετατροπές τύπου και θα ανακαλύψετε γιατί «Γ» - «Α» παράγει έναν ακέραιο (2), ο οποίος χρησιμεύει ως έγκυρος δείκτης.)

Το τελευταίο παράδειγμα, το οποίο περνά ως ευρετήριο του χειριστή ευρετηρίου συστοιχιών, σχολιάζεται επειδή δεν θα μεταγλωττιστεί. Εάν απογοητεύσετε τη γραμμή και προσπαθήσετε να μεταγλωττίσετε την καταχώριση 2, θα λάβετε ένα μήνυμα σφάλματος σχετικά με μη συμβατούς τύπους: διπλό προς την int.."

Συλλογή καταχώρισης 2 (javac ArrayIndexOp.java) και εκτελέστε την εφαρμογή (java ArrayIndexOp). Πρέπει να παρατηρήσετε την ακόλουθη έξοδο:

90 91 79 68

Ο χειριστής ευρετηρίου συστοιχιών και πολυδιάστατες συστοιχίες

Μπορείτε να χρησιμοποιήσετε αυτόν τον τελεστή με πολυδιάστατες συστοιχίες. Για παράδειγμα, υποθέτοντας ένα δισδιάστατο δικαστικά έξοδα πίνακας, κόστος [0] [1] έχει πρόσβαση στο στοιχείο που έχει εκχωρηθεί στην πρώτη σειρά (μέσω [0]) και τη δεύτερη στήλη (μέσω [1]).

Χειριστές ανάθεσης

ο χειριστής ανάθεσης (=) εκχωρεί μια τιμή έκφρασης σε μια μεταβλητή (π.χ., i = 6;), συμπεριλαμβανομένου ενός στοιχείου πίνακα (π.χ., x [0] = 15;). Η έκφραση και η μεταβλητή πρέπει να είναι συμβατή ανάθεση, που σημαίνει ότι οι τύποι τους πρέπει να συμφωνήσουν. Για παράδειγμα, δεν μπορείτε να αντιστοιχίσετε μια συμβολοσειρά κυριολεκτικά σε μια ακέραια μεταβλητή. Θα εξηγήσω περισσότερα σχετικά με αυτό όταν συζητάμε για μετατροπές τύπου.

Οι τελεστές ανάθεσης σύνθετων (+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>=) αξιολογήστε τις εκφράσεις και εκχωρήστε τα αποτελέσματα σε μεταβλητές σε ένα βήμα. Κάθε έκφραση και μεταβλητή πρέπει να είναι συμβατή με την ανάθεση. Κάθε χειριστής χρησιμεύει ως μια χρήσιμη συντόμευση. Για παράδειγμα, αντί να καθορίσετε x = x + 3;, μπορείτε να καθορίσετε το συντομότερο και το αντίστοιχο x + = 3;.

Κρατήστε το σύντομο!

Αντί να καθορίσετε x = x + 1; ή x = x - 1;, θα μπορούσατε να καθορίσετε το συντομότερο x + = 1; ή x - = 1;. Θα μπορούσες να σώσεις ακόμα περισσότερο πληκτρολογήσεις πληκτρολογώντας τον συντομότερο x ++; ή Χ--;.

Τελεστές Bitwise