Λειτουργίες σε πρωτόγονους τύπους σε Java. Αριθμητικές πράξεις


Σπουδές για να γίνεις «Προγραμματιστής παιχνιδιών» + απασχόληση

Χειριστές σε Java

Να αναπαραστήσουν τις πράξεις πρόσθεσης, αφαίρεσης, πολλαπλασιασμού και διαίρεσης σε Γλώσσα JavaΧρησιμοποιούνται οι συνήθεις αριθμητικοί τελεστές + - * /.

Ο τελεστής / υποδηλώνει διαίρεση ακεραίων αν και τα δύο ορίσματά του είναι ακέραιοι. Διαφορετικά, αυτός ο τελεστής υποδηλώνει διαίρεση αριθμών κινητής υποδιαστολής. Το υπόλοιπο μιας διαίρεσης ακέραιου αριθμού (δηλαδή, η συνάρτηση mod) συμβολίζεται με το σύμβολο %.
Για παράδειγμα, το 15/2 είναι ίσο με 7, το 15%2 είναι ίσο με 1 και το 15 είναι . 0/2 ισούται με 7. 5.

Σημειώστε ότι μια διαίρεση ακέραιου με το 0 δημιουργεί μια εξαίρεση, ενώ μια διαίρεση κινητής υποδιαστολής με το 0 οδηγεί σε άπειρο ή NaN.

Οι αριθμητικοί τελεστές μπορούν να χρησιμοποιηθούν για την προετοιμασία μεταβλητών.

int n = 5;
int a = 2 *n; // Η τιμή της μεταβλητής a είναι 10.

Είναι βολικό να χρησιμοποιείτε συντομευμένους δυαδικούς αριθμητικούς τελεστές σε τελεστές εκχώρησης.

Για παράδειγμα, ο χειριστής
x + = 4;
ισοδυναμεί με τον χειριστή
x = x + 4;

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

Ένας από τους δηλωμένους στόχους της γλώσσας Java είναι η ανεξαρτησία της μηχανής.

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

διπλό w = x * y / z;

Πολλοί επεξεργαστές Intel αξιολογούν την έκφραση x * y και αποθηκεύουν αυτό το ενδιάμεσο αποτέλεσμα σε έναν καταχωρητή 80 bit, στη συνέχεια το διαιρούν με την τιμή της μεταβλητής z και τέλος στρογγυλοποιούν την απάντηση στα 64 bit. Με αυτόν τον τρόπο μπορείτε να αυξήσετε την ακρίβεια των υπολογισμών αποφεύγοντας την υπερχείλιση. Ωστόσο, αυτό το αποτέλεσμα μπορεί να είναι διαφορετικό εάν όλοι οι υπολογισμοί εκτελούνται σε επεξεργαστή 64-bit.

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

Από προεπιλογή, οι προγραμματιστές εικονικών μηχανών επιτρέπουν πλέον τη χρήση εκτεταμένης ακρίβειας σε ενδιάμεσους υπολογισμούς. Ωστόσο, οι μέθοδοι που επισημαίνονται με τη λέξη-κλειδί strictfp πρέπει να χρησιμοποιούν ακριβείς πράξεις κινητής υποδιαστολής για να διασφαλίζουν αναπαραγώγιμα αποτελέσματα. Για παράδειγμα, η κύρια μέθοδος μπορεί να επισημανθεί με λέξεις-κλειδιά όπως φαίνεται παρακάτω:
δημόσιο στατικό αυστηρό fp void main (Args συμβολοσειράς)

Σε αυτήν την περίπτωση, όλες οι εντολές μέσα στην κύρια μέθοδο θα εκτελούν ακριβείς λειτουργίες σε αριθμούς κινητής υποδιαστολής.

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

Αν τα μάτια σας γυαλίζουν καθώς διαβάζετε αυτό το σχόλιο, μην ανησυχείτε. Για τους περισσότερους προγραμματιστές, αυτό το ζήτημα είναι εντελώς ασήμαντο. Η υπερχείλιση δεν συμβαίνει στους υπολογισμούς κινητής υποδιαστολής στις περισσότερες περιπτώσεις. Σε αυτό το βιβλίο δεν θα χρησιμοποιήσουμε λέξη-κλειδίαυστηρόfp.

Χειριστές Αύξησης και Μείωσης

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

Για παράδειγμα, κωδικός
int n = 12;
n++;
κάνει την τιμή της μεταβλητής n ίση με 13.

Επειδή αυτοί οι τελεστές αλλάζουν την τιμή μιας μεταβλητής, δεν μπορούν να εφαρμοστούν στους ίδιους τους αριθμούς. Για παράδειγμα, ο τελεστής 4++ δεν είναι έγκυρος.

Υπάρχουν δύο τύποι αυτών των τελεστών. Εμφανίζεται παραπάνω η μορφή "postfix" του τελεστή, στην οποία τα σύμβολα λειτουργίας τοποθετούνται μετά τον τελεστή. Υπάρχει επίσης μια φόρμα "πρόθεμα" - ++n.
Και οι δύο αυτοί τελεστές αυξάνουν την τιμή μιας μεταβλητής κατά ένα. Η διαφορά μεταξύ τους εμφανίζεται μόνο όταν αυτοί οι τελεστές χρησιμοποιούνται μέσα σε εκφράσεις. Η φόρμα προθέματος του τελεστή προσαύξησης προσθέτει πρώτα ένα στην τιμή της μεταβλητής, ενώ η φόρμα postfix χρησιμοποιεί την παλιά τιμή αυτής της μεταβλητής.

int m = 7;
int n = 7;
int a = 2 * ++m; // Τώρα η τιμή του a είναι 16 και το m είναι 8.
int b = 2 * n++; // Τώρα η τιμή του b είναι 14 και το n είναι 8.

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

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

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

ΑΝΑΘΕΣΗ ΕΡΓΑΣΙΑΣ μεταβλητή τιμήςκαλείται μια σταθερά, μια άλλη μεταβλητή ή έκφραση (μεταβλητές ή/και σταθερές που χωρίζονται με σύμβολα τελεστή). λειτουργία ανάθεσηςκαι υποδεικνύεται με το σύμβολο " = ", για παράδειγμα: x = 3 ; y = x; z = x; Στη Java, είναι δυνατό να χρησιμοποιηθεί ο τελεστής εκχώρησης πολλές φορές σε μία έκφραση, για παράδειγμα: x1 = x2 = x3 = 0 ; Αυτή η λειτουργία εκτελείται από από δεξιά προς τα αριστερά, δηλαδή στη μεταβλητή x3 εκχωρείται πρώτα η τιμή 0, μετά στη μεταβλητή x2 εκχωρείται η τιμή της μεταβλητής x3 (0) και τέλος στη μεταβλητή x1 εκχωρείται η τιμή της μεταβλητής x2 (0). Οι πράξεις των οποίων τα ορίσματα είναι αριθμοί χωρίζονται σε δύο κατηγορίες: ενιαία(μοναδικά) σημάδια πράξεων με ένα όρισμα και δυάδικος(δυαδικό) με δύο ορίσματα.

Ενιαίες πράξεις

Οι ακόλουθοι unary τελεστές ορίζονται στην Java:
  • unary μείον " - " – αλλάζει το πρόσημο ενός αριθμού ή έκφρασης στο αντίθετο.
  • unary plus " + " – δεν εκτελεί καμία ενέργεια σε έναν αριθμό ή έκφραση.
  • συμπλήρωμα bitwise "~" (μόνο για ακέραιους αριθμούς) – αντιστρέφει όλα τα bit του πεδίου αριθμών (αλλάζει 0 σε 1 και 1 σε 0).
  • αύξηση "++" (μόνο για ακέραιους αριθμούς) – αυξάνει την τιμή της μεταβλητής κατά 1.
  • decrement " -- " (μόνο για ακέραιους αριθμούς) - μειώνει την τιμή της μεταβλητής κατά 1.
Παραδείγματα μοναδικών πράξεων " + " και " - ": int i = 3 , j, k; j= - i; // j = -3 k = + i; // k = 3 Παράδειγμα λειτουργίας συμπληρώματος bitwise: int a = 15 ; int b; b = ~a; // b = -16 Οι αριθμοί a και b είναι αριθμοί πληκτρολογήστε int, δηλ. αντιπροσωπεύονται εσωτερικά από τον υπολογιστή ως υπογεγραμμένοι δυαδικοί ακέραιοι μήκους 32 bit, επομένως η δυαδική αναπαράσταση των αριθμών a και b θα μοιάζει με αυτό: a = 00000000 00000000 00000000 00001111 b = 11111111 11111 από αυτή την παράσταση, όλα τα μηδενικά μπιτ στον αριθμό α αλλάζουν σε ένα μπιτ στο β και τα ένα μπιτ στο α αλλάζουν σε μηδενικά μπιτ. Η δεκαδική παράσταση του b είναι –16. Οι πινακίδες λειτουργίας αύξησης και μείωσης μπορούν να τοποθετηθούν είτε πριν είτε μετά τη μεταβλητή. Αυτές οι επιλογές ονομάζονται ανάλογα πρόθεμαΚαι postfixκαταγραφή αυτών των συναλλαγών. Ο συμβολισμός του προθέματος εισόδου χειριστή επιστρέφει την τιμή του τελεστή του μετάαξιολόγηση έκφρασης. Στη σημειογραφία postfix, το σύμβολο της λειτουργίας αρχικάεπιστρέφει την τιμή του τελεστή του και μόνο μετά από αυτό υπολογίζει την αύξηση ή τη μείωση, για παράδειγμα: int x = 1, y, z; y = ++x; z= x++ ; Στη μεταβλητή y θα εκχωρηθεί η τιμή 2 γιατί η τιμή του x πρώτα θα αυξηθεί κατά 1 και μετά το αποτέλεσμα θα εκχωρηθεί στη μεταβλητή y . Στη μεταβλητή z θα εκχωρηθεί η τιμή 1 γιατί πρώτα στη μεταβλητή z θα εκχωρηθεί μια τιμή και μετά η τιμή του x θα αυξηθεί κατά 1 . Και στις δύο περιπτώσεις, η νέα τιμή του x θα είναι 2. Πρέπει να σημειωθεί ότι στη Java, σε αντίθεση με τη γλώσσα C, οι πράξεις μείωσης και αύξησης μπορούν επίσης να εφαρμοστούν σε πραγματικές μεταβλητές (τύπος float και double). Δυαδικά Σήματα Λειτουργίαςχωρίζονται σε πράξεις με αριθμητικό αποτέλεσμα και σε πράξεις σύγκρισης, το αποτέλεσμα των οποίων είναι μια Boolean τιμή.

Αριθμητικές δυαδικές πράξεις

Η Java ορίζει τα εξής αριθμητικές δυαδικές πράξεις:
  • προσθήκη "+";
  • αφαίρεση " - ";
  • πολλαπλασιασμός " * ";
  • διαίρεση "/";
  • υπολογίζοντας το υπόλοιπο της διαίρεσης των ακεραίων "%" (επιστρέφει το υπόλοιπο της διαίρεσης του πρώτου αριθμού με το δεύτερο και το αποτέλεσμα θα έχει το ίδιο πρόσημο με το μέρισμα), για παράδειγμα, το αποτέλεσμα της πράξης 5%3 θα είναι ίσο με 2 και το αποτέλεσμα της πράξης (-7) %(-4) θα είναι ίσο με -3. Στη Java, η λειτουργία μπορεί επίσης να χρησιμοποιηθεί για πραγματικές μεταβλητές (τύπος float ή double).
Δυαδικά παραδείγματα αριθμητικές πράξεις: int x = 7, x1, x2, x3, x4, x5; x1 = x + 10 ; // x1 = 17 x2 = x – 8 ; // x2 = -1 x3 = x2 * x; // x3 = -7 x4 = x/ 4 ; // x4 = 1 (κατά τη διαίρεση ακεραίων // το κλασματικό μέρος απορρίπτεται) x5 = x% 4 // x5 = 3 (υπόλοιπο διαίρεσης// 7 επί 4)

Λειτουργίες bitwise

  • Οι λειτουργίες bitwise θεωρούν το αρχικό αριθμητικές τιμέςως πεδία bit και εκτελέστε τις ακόλουθες ενέργειες σε αυτά:
  • ρύθμιση bit in ΕγώΗ θέση του πεδίου αποτελέσματος είναι 1 εάν και τα δύο bit είναι μέσα ΕγώΟι θέσεις των τελεστών είναι ίσες με 1 ή 0 διαφορετικά – κατά bit AND ("& ");
  • ρύθμιση bit in ΕγώΗ θέση του πεδίου αποτελέσματος είναι 1 εάν τουλάχιστον ένα bit in ΕγώΟι θέσεις των τελεστών είναι ίσες με 1, ή 0 διαφορετικά – κατά bit OR (" | ");
  • ρύθμιση bit in ΕγώΗ θέση του πεδίου αποτελέσματος είναι 1 εάν τα bit είναι μέσα Εγώ-οι θέσεις των τελεστών δεν είναι ίσες μεταξύ τους, ή στο 0 διαφορετικά – αποκλειστική κατά bit OR (" ^ ").
  • μετατόπιση προς τα αριστερά των δυαδικών ψηφίων του πεδίου του πρώτου τελεστή από τον αριθμό των δυαδικών ψηφίων που καθορίζονται από τον δεύτερο τελεστή (το μπιτ πρόσημου του αριθμού δεν αλλάζει) - μετατόπιση bit προς τα αριστερά λαμβάνοντας υπόψη το πρόσημο "<< ";
  • δεξιά μετατόπιση των bit του πρώτου πεδίου τελεστέου από τον αριθμό των bit που καθορίζεται από τον δεύτερο τελεστή (το bit του αριθμού δεν αλλάζει) – μετατόπιση bit προς τα δεξιά, λαμβάνοντας υπόψη το σύμβολο " >>".
  • μετατόπιση προς τα δεξιά των δυαδικών ψηφίων του πεδίου του πρώτου τελεστή από τον αριθμό των δυαδικών ψηφίων που καθορίζονται από τον δεύτερο τελεστή (μετατοπίζεται επίσης το bit πρόσημου του αριθμού) - μετατόπιση κατά bit προς τα δεξιά χωρίς να ληφθεί υπόψη το " >>> " σημάδι.
Παραδείγματα πράξεων bitwise:
  1. Bitwise ΚΑΙ

    int x = 112 ; int y = 94 ; int z; z = x & y; // z=80: 00000000 00000000 00000000 01010000
  2. Bitwise Ή

    int x = 112 ; // x: 00000000 00000000 00000000 01110000 int y = 94 ; // y: 00000000 00000000 00000000 01011110 int z; z = x | y; // z = 126: 00000000 00000000 00000000 01111110
  3. Bitwise αποκλειστικό OR

    int x = 112 ; // x: 00000000 00000000 00000000 01110000 int y = 94 ; // y: 00000000 00000000 00000000 01011110 int z; z = x^y; // z = 46: 00000000 00000000 00000000 00101110
  4. Αριστερά μετατόπιση βάσει πινακίδας

    int x = 31, z; // x: 00000000 00000000 00000000 00011111 z = x<< 2 ; // z = 124: 00000000 00000000 00000000 01111100
  5. Δεξιά μετατόπιση με πινακίδα

    int x = - 17, z; z = x >> 2 ; // z = -5: 11111111 11111111 11111111 11111011
  6. Δεξιά μετατόπιση χωρίς να λαμβάνεται υπόψη το σημάδι

    int x = - 17, z; // x: 11111111 11111111 11111111 11101111 z = x >>> 2 ; // z = 1073741819 // z: 00111111 11111111 11111111 11111011

Συνδυασμένες λειτουργίες

Στην Java, για δυαδικές αριθμητικές πράξεις μπορείτε να χρησιμοποιήσετε σε συνδυασμό(σύνθετα) σήματα χειριστή: λειτουργία αναγνωριστικού = έκφραση Αυτό ισοδυναμεί με την ακόλουθη πράξη: αναγνωριστικό = έκφραση λειτουργίας αναγνωριστικού Παραδείγματα:
  1. Η έκφραση x += b σημαίνει x = x + b.
  2. Η έκφραση x -= b σημαίνει x = x - b .
  3. Η έκφραση x *= b σημαίνει x = x * b .
  4. Η έκφραση x /= b σημαίνει x = x / b.
  5. Η έκφραση x %= b σημαίνει x = x % b .
  6. Η έκφραση x &= b σημαίνει x = x & b .
  7. Η έκφραση x |= b σημαίνει x = x | σι.
  8. Η έκφραση x ^= b σημαίνει x = x ^ b .
  9. Έκφραση x<<= b означает x = x << b .
  10. Η έκφραση x >>= b σημαίνει x = x >> b .
  11. Η έκφραση x >>>= b σημαίνει x = x >>> b .

Λειτουργίες σύγκρισης

Η Java ορίζει τους ακόλουθους τελεστές σύγκρισης:
  • " == " (ίσο), " != " (όχι ίσο),
  • " > " (μεγαλύτερο από), " >= " (μεγαλύτερο ή ίσο με),
  • " < " (меньше) " <= " (меньше или равно)
έχουν δύο τελεστές και επιστρέφουν μια τιμή boolean που αντιστοιχεί στο αποτέλεσμα της σύγκρισης ( ψευδήςή αληθής). Λάβετε υπόψη ότι όταν συγκρίνετε δύο ποσότητες για ισότητα στην Java, όπως στη C και τη C++, τα σύμβολα " == " (δύο διαδοχικά ίσα σημάδια χωρίς κενό), σε αντίθεση με τον τελεστή εκχώρησης, ο οποίος χρησιμοποιεί το σύμβολο " = ". Η χρήση του συμβόλου " = " κατά τη σύγκριση δύο τιμών είτε προκαλεί σφάλμα μεταγλώττισης είτε οδηγεί σε εσφαλμένο αποτέλεσμα. Παραδείγματα πράξεων σύγκρισης: boolean isEqual, isNonEqual, isGreater, isGreaterOrEqual, isLess, isLessOrEqual; int x1 = 5, x2 = 5, x3 = 3, x4 = 7; isEqual = x1 == x2; // isEqual = true isNonEqual = x1 != x2; // isNonEqual = false isGreater = x1 > x3; // isGreater = true // isGreaterOrEqual = true isGreaterOrEqual = x2 >= x3; isLess = x3< x1; // isLess = true isLessOrEqual = x1 <= x3; // isLessOrEqual = false

Λειτουργίες Boolean

Λειτουργίες Booleanεκτελούνται σε μεταβλητές Boolean και το αποτέλεσμά τους είναι επίσης μια τιμή τύπου boolean. Οι ακόλουθες λειτουργίες Boolean ορίζονται στην Java:
  • άρνηση "!" – αντικατάσταση του false με true ή αντίστροφα.
  • ΚΑΙ λειτουργία "&" – το αποτέλεσμα είναι αληθές μόνο αν και οι δύο τελεστές είναι αληθείς, διαφορετικά το αποτέλεσμα είναι ψευδές.
  • Ή λειτουργία "|" – το αποτέλεσμα είναι αληθές μόνο εάν τουλάχιστον ένας από τους τελεστές είναι αληθής, διαφορετικά το αποτέλεσμα είναι ψευδές.
  • αποκλειστική πράξη Ή "^" - το αποτέλεσμα είναι αληθές μόνο εάν οι τελεστές δεν είναι ίσοι μεταξύ τους, διαφορετικά το αποτέλεσμα είναι ψευδές.
Οι πράξεις " & ", " | " και " ^ " μπορούν, καθώς και οι αντίστοιχες πράξεις bitwise, να χρησιμοποιηθούν σε πράξεις σύνθετης εκχώρησης: " &= ", " |= " και " ^= " Επιπλέον, οι πράξεις " = " ισχύουν για Boolean τελεστές = " (ίσο) και " != " (όχι ίσο). Όπως μπορείτε να δείτε από τον ορισμό των τελεστών OR και AND, η πράξη OR έχει ως αποτέλεσμα το αποτέλεσμα true όταν ο πρώτος τελεστής είναι αληθής, ανεξάρτητα από την τιμή του δεύτερου τελεστή, και η πράξη AND έχει ως αποτέλεσμα το αποτέλεσμα false όταν ο πρώτος Ο τελεστής είναι ψευδής, ανεξάρτητα από την τιμή του δεύτερου τελεστή. Η Java ορίζει δύο ακόμη τελεστές Boole: τις δεύτερες εκδόσεις των τελεστών Boolean AND και OR, γνωστοί ως λογικοί τελεστές βραχυκυκλώματος: short-AND "&&" και short-circuit OR "||". Όταν χρησιμοποιείτε αυτές τις πράξεις, ο δεύτερος τελεστής δεν θα αξιολογηθεί καθόλου, κάτι που είναι χρήσιμο σε περιπτώσεις όπου η σωστή λειτουργία του δεξιού τελεστή εξαρτάται από το αν ο αριστερός τελεστής είναι αληθής ή ψευδής. Παραδείγματα πράξεων Boolean: boolean isInRange, isValid, isNotValid, isEqual, isNotEqual; int x = 8 ; isInRange = x > 0 && x< 5 ; // isInRange = false isValid = x >0 || x > 5 ; // isValid = true isNotValid = ! είναι έγκυρο; // isNotValid = false isEqual = isInRange == isValid; // isEqual = false // isNotEqual = true isNotEqual = isInRange != isValid

Λειτουργία υπό όρους

Η υπό όρους πράξη γράφεται με τη μορφή έκφραση-1?έκφραση-2:έκφραση-3. Σε αυτήν την περίπτωση, πρώτα αξιολογείται η έκφραση έκφραση-1, η οποία θα πρέπει να δώσει μια τιμή Boole, και στη συνέχεια, εάν η έκφραση-1 είναι αληθής, η έκφραση-2 αξιολογείται και επιστρέφεται ως αποτέλεσμα της πράξης, ή (εάν έκφραση-1 είναι ψευδής), αξιολογείται και, ως αποτέλεσμα της λειτουργίας, επιστρέφεται η έκφραση-3. Παράδειγμα λειτουργίας υπό όρους: x= n> 1 ? 0 : 1 ; Στη μεταβλητή x θα εκχωρηθεί η τιμή 0 εάν n>1 (η έκφραση n>1 είναι αληθής) ή 1 εάν n≤1 (η έκφραση n>1 είναι ψευδής).

Αρχαιότητα λειτουργίας

Οι πράξεις στις εκφράσεις εκτελούνται από αριστερά προς τα δεξιά, ωστόσο, σύμφωνα με την προτεραιότητά τους. Άρα οι πράξεις πολλαπλασιασμού στην παράσταση y = x + z* 5; θα εκτελεστεί πριν από την πράξη πρόσθεσης επειδή η προτεραιότητα της πράξης πολλαπλασιασμού είναι μεγαλύτερη από την προτεραιότητα της πράξης πρόσθεσης. Οι προτεραιότητες των λειτουργιών (με σειρά φθίνουσας προτεραιότητας) στην Java δίνονται στον πίνακα. 1.
Οι παρενθέσεις αυξάνουν την προτεραιότητα των πράξεων που βρίσκονται μέσα σε αυτές. Έτσι, εάν εισάγετε παρενθέσεις στην παραπάνω παράσταση: y = (x + z) * 5 ; τότε θα εκτελεστεί πρώτα η πράξη πρόσθεσης και μετά η πράξη πολλαπλασιασμού. Μερικές φορές οι παρενθέσεις χρησιμοποιούνται απλώς για να κάνουν μια έκφραση πιο ευανάγνωστη, για παράδειγμα: (x > 1 ) && (x<= 5 ) ;

Μετατροπή και χύτευση κατά την εκτέλεση εργασιών

Οι πράξεις ανάθεσης και οι αριθμητικές εκφράσεις μπορούν να χρησιμοποιούν κυριολεκτικά, μεταβλητές και εκφράσεις διαφόρων τύπων, για παράδειγμα: double y; byte x; y = x + 5; Αυτό το παράδειγμα προσθέτει τη μεταβλητή byte x στο int literal 5 και εκχωρεί το αποτέλεσμα στη διπλή μεταβλητή y. Στην Java, όπως και στη γλώσσα C, οι μετατροπές τύπων κατά την αξιολόγηση παραστάσεων μπορούν να εκτελεστούν αυτόματα ή χρησιμοποιώντας έναν τελεστή τύπου cast. Ωστόσο, οι κανόνες για τη μετάδοση τύπων διαφέρουν ελαφρώς από τους κανόνες της γλώσσας C και είναι γενικά πιο αυστηροί από ό,τι στη γλώσσα C. Κατά την εκτέλεση μιας λειτουργίας ανάθεσης, η μετατροπή τύπου πραγματοποιείται αυτόματα εάν διευρυνόμενος μετασχηματισμός(διεύρυνση μετατροπής) και δύο τύποι είναι συμβατοί. Οι επεκτεινόμενοι μετασχηματισμοί είναι μετασχηματισμοί ψηφιόλεξη® μικρός® ενθ® μακρύς® φλοτέρ® διπλό. Για τη διεύρυνση των μετατροπών, οι αριθμητικοί τύποι, συμπεριλαμβανομένων των ακεραίων και κινητής υποδιαστολής, είναι συμβατοί μεταξύ τους. Ωστόσο, οι αριθμητικοί τύποι δεν είναι συμβατοί με τους τύπους char και boolean. Οι τύποι char και boolean είναι επίσης ασυμβίβαστοι μεταξύ τους. Η Java εκτελεί επίσης αυτόματη μετατροπή τύπων όταν αποθηκεύει μια κυριολεκτική ακέραια σταθερά (η οποία είναι προεπιλεγμένη σε int) σε μια μεταβλητή τύπου byte, short ή long (ωστόσο, εάν το literal έχει τιμή εκτός του εύρους των έγκυρων τιμών για αυτόν τον τύπο, εκδίδεται ένα μήνυμα σφάλματος: πιθανή απώλεια ακρίβειας). Εάν η μετατροπή είναι μια μετατροπή στένωσης, δηλαδή, εκτελείται διπλή μετατροπή byte ¬ σύντομο ¬ char ¬ int ¬ long ¬ float ¬ διπλή μετατροπή, τότε μια τέτοια μετατροπή μπορεί να οδηγήσει σε απώλεια της ακρίβειας του αριθμού ή σε παραμόρφωσή του. Επομένως, κατά τη διάρκεια του περιορισμού των μετατροπών, κατά τη μεταγλώττιση ενός προγράμματος, εμφανίζεται ένα διαγνωστικό μήνυμα σχετικά με την ασυμβατότητα τύπου και δεν δημιουργούνται αρχεία κλάσης. Αυτό το μήνυμα θα εκδοθεί επίσης εάν προσπαθήσετε να μετατρέψετε μια έκφραση τύπου byte ή short σε μια μεταβλητή τύπου char . Εάν εξακολουθεί να είναι απαραίτητο να πραγματοποιηθούν τέτοιες μετατροπές, χρησιμοποιείται η λειτουργία cast τύπου, η οποία έχει την ακόλουθη μορφή: ( μετατροπή τύπου) έννοια, Οπου μετατροπή τύπουκαθορίζει τον τύπο στον οποίο πρέπει να μετατραπούν τα δεδομένα έννοια, για παράδειγμα, ως αποτέλεσμα της εκτέλεσης των τελεστών: byte x = 71 ; σύμβολο char = (char ) x; η μεταβλητή συμβόλων θα λάβει την τιμή " G ". Εάν μια τιμή κινητής υποδιαστολής έχει εκχωρηθεί σε έναν ακέραιο τύπο, τότε (αν η τιμή κινητής υποδιαστολής έχει κλασματικό μέρος) λαμβάνει χώρα επίσης μια μετατροπή ρητού τύπου περικοπή(περικοπή) αριθμοί. Άρα, ως αποτέλεσμα της εκτέλεσης του τελεστή int x = (int) 77.85; η μεταβλητή x θα πάρει την τιμή 77 . Εάν η εκχωρηθείσα τιμή είναι εκτός του εύρους μετατροπή τύπου , τότε το αποτέλεσμα του μετασχηματισμού θα είναι το υπόλοιπο της διαίρεσης της τιμής με το μέτρο του εύρους του εκχωρημένου τύπου (για αριθμούς byte τύπου, ο συντελεστής του εύρους θα είναι ίσος με 256, για συντομία - 65536, για int – 4294967296 και για μεγάλο χρονικό διάστημα – 18446744073709551616). Για παράδειγμα, ως αποτέλεσμα της εκτέλεσης του τελεστή byte x = (byte ) 514 ; η μεταβλητή x θα λάβει την τιμή 2. Κατά τη μετατροπή ακεραίων ή πραγματικών αριθμών σε δεδομένα χαρακτήρων, η μετατροπή σε χαρακτήρα λαμβάνει χώρα εάν ο αρχικός αριθμός είναι στην περιοχή από 0 έως 127, διαφορετικά δίνεται στον χαρακτήρα η τιμή "?". Κατά την εκτέλεση αριθμητικών και μετατροπών bitwise, όλες οι τιμές byte και short, καθώς και το char, επεκτείνονται σε int , (με την αριθμητική τιμή του κωδικού χαρακτήρων που χρησιμοποιείται στους υπολογισμούς για char ) τότε, εάν τουλάχιστον ένας τελεστής είναι τύπου long , ο τύπος της ακέραιας έκφρασης επεκτείνεται σε long. Εάν ένας από τους τελεστές είναι τύπου float, τότε ο τύπος της πλήρους έκφρασης επεκτείνεται σε float και εάν ένας από τους τελεστές είναι τύπου double, τότε ο τύπος του αποτελέσματος είναι διπλός. Έτσι, εάν οι μεταβλητές byte a, c; σύντομη β? τότε στην έκφραση a + b* c – 15 L + 1,5F + 1,08 - 10; πρώτα, πριν τον υπολογισμό του a + b*c, οι τιμές των μεταβλητών θα επεκταθούν σε int , στη συνέχεια, καθώς η σταθερά 15 είναι τύπου long, το αποτέλεσμα του υπολογισμού θα επεκταθεί σε πολύ πριν την αφαίρεση. Μετά από αυτό, δεδομένου ότι το κυριολεκτικό 1,5 είναι τύπου float, πριν το προσθέσετε με αυτό το κυριολεκτικό, το αποτέλεσμα της αξιολόγησης ενός + b*c – 15L θα επεκταθεί σε float . Πριν από την εκτέλεση της πρόσθεσης στον αριθμό 1.08, το αποτέλεσμα των προηγούμενων υπολογισμών θα επεκταθεί στο διπλάσιο (καθώς οι πραγματικές σταθερές είναι τύπου διπλά από προεπιλογή) και τέλος, πριν εκτελεστεί η τελευταία πρόσθεση, το κυριολεκτικό 10 (προεπιλογή int) θα είναι επεκτάθηκε σε διπλάσιο. Έτσι, το αποτέλεσμα της αξιολόγησης της έκφρασης θα είναι τύπου double . Οι αυτόματες επεκτάσεις τύπου (ειδικά οι επεκτάσεις σύντομων και byte σε int) μπορούν να προκαλέσουν κακώς αναγνωρισμένα σφάλματα κατά το χρόνο μεταγλώττισης. Για παράδειγμα, στους τελεστές: byte x = 30 , y = 5 ; x = x + y; Οι μεταβλητές x και y θα επεκταθούν σε int πριν από την εκτέλεση της προσθήκης και, στη συνέχεια, θα εμφανιστεί ένα μήνυμα σφάλματος κατά την προσπάθεια αντιστοίχισης του αποτελέσματος μιας int σε μια μεταβλητή byte. Για να αποφύγετε αυτό, πρέπει να χρησιμοποιήσετε μια ρητή μετατροπή τύπου στον δεύτερο τελεστή: x = (byte) (x + y) ; Η έκφραση x + y πρέπει να περικλείεται σε παρένθεση επειδή η προτεραιότητα της λειτουργίας cast τύπου που περικλείεται σε παρενθέσεις είναι υψηλότερη από την προτεραιότητα της πράξης πρόσθεσης. Παρεμπιπτόντως, αν γράψετε τον δεύτερο τελεστή με τη μορφή: x += y; τότε δεν θα υπάρχει μήνυμα σφάλματος. Σύνδεσμος στο πρώτο

Με σειρά προτεραιότητας, οι τελεστές μονού ακολουθούνται από τους αριθμητικούς τελεστές. Αυτή η ομάδα περιλαμβάνει τους τέσσερις πιο συνηθισμένους τελεστές: πρόσθεση, αφαίρεση, πολλαπλασιασμό, διαίρεση. Και όχι μόνο αυτοί. Υπάρχει επίσης ένας τελεστής διαίρεσης modulo, ο οποίος συμβολίζεται με το σύμβολο %. Οι αριθμητικοί τελεστές χωρίζονται σε δύο ομάδες. Η πρώτη ομάδα υψηλότερης προτεραιότητας περιέχει *, /, %. Στη δεύτερη, αντίστοιχα, + και -.

Πολλαπλασιασμός και διαίρεση (* και /)

Οι τελεστές * και / εκτελούν πολλαπλασιασμό και διαίρεση σε όλους τους αρχέγονους αριθμούς και τους χαρακτήρες. Όταν διαιρείται με το μηδέν, εμφανίζεταιΑριθμητική Εξαίρεση.

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

Εάν πολλαπλασιάσετε ή διαιρέσετε δύο αριθμούς, το αποτέλεσμα υπολογίζεται χρησιμοποιώντας ακέραια αριθμητική και αποθηκεύεται είτε σε int είτε σε long . Εάν οι αριθμοί είναι πολύ μεγάλοι, τότε το αποτέλεσμα θα είναι μεγαλύτερο από τον μέγιστο αριθμό που μπορεί να αναπαρασταθεί σε αυτούς τους αριθμούς. Αυτό σημαίνει ότι το αποτέλεσμα δεν θα μπορεί να κωδικοποιηθεί σωστά από τον υπολογιστή και δεν θα έχει νόημα. Για παράδειγμα, ο τύπος byte χρησιμοποιείται για την αναπαράσταση αριθμών στην περιοχή -128 έως 127. Αν πολλαπλασιάσουμε το 64 και το 4, το αποτέλεσμα 256, το οποίο έχει εννέα χαρακτήρες στη δυαδική σημείωση 100000000, θα κωδικοποιηθεί ως 0 επειδή το byte χρησιμοποιεί μόνο 8 χαρακτήρες .

Ας εξετάσουμε τη διαίρεση. Εάν διαιρέσετε σε ακέραιους αριθμούς, το αποτέλεσμα πρέπει να είναι ακέραιος. Αυτό σημαίνει ότι το κλασματικό μέρος θα χαθεί. Για παράδειγμα, το 7/4 μας δίνει 1,75, αλλά στην αριθμητική ακέραιο θα ήταν 1.

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

1. int a = 12345, b = 234567, c, d;
2. μακρύς e, f;
3.
4. c = a * b / b; // πρέπει να ισούται με a=12345
5. d = a / b * b; // θα πρέπει επίσης να ισούται με a=12345
6. System.out.println("a είναι " + a +
7. "\nb είναι " + b +
8. "\nc είναι " + c +
9. "\nd είναι " + d);
10.
11. e = (μακρύ)a * b / b;
12. f = (μακρύ)a / b * b;
13. System.out.println(
14. "\ne είναι " + e +
15. "\nf είναι " + f);

Το αποτέλεσμα αυτού του τμήματος θα παράγει τα εξής:

Το Α είναι 12345
b είναι 234567
c είναι -5965
d είναι 0
e είναι 12345
f είναι 0

Μην σας μπερδεύουν οι αριθμητικές τιμές σε αυτό το παράδειγμα. Το σημαντικό είναι ότι όταν κάναμε πρώτα τον πολλαπλασιασμό, είχαμε μια υπερχείλιση (c είναι -5965) όταν την κωδικοποιήσαμε σε τύπο int. Ωστόσο, μπορούμε να έχουμε το σωστό αποτέλεσμα αν το κωδικοποιήσουμε σε μεγαλύτερο τύπο, όπως long . Και στις δύο περιπτώσεις, η εφαρμογή της διαίρεσης πρώτα θα είναι καταστροφική για το αποτέλεσμα, ανεξάρτητα από το μήκος του τύπου της.

Υποδιαίρεση %

Το αποτέλεσμα της διαίρεσης modulo είναι το υπόλοιπο της διαίρεσης. Για παράδειγμα, το 7/4 είναι ίσο με 1 με υπόλοιπο 3. Επομένως, 7%4 = 3. Συνήθως οι τελεστές είναι ακέραιου τύπου, αλλά μερικές φορές ο τελεστής εφαρμόζεται σε αριθμούς κινητής υποδιαστολής. Θα πρέπει επίσης να γνωρίζετε ορισμένα χαρακτηριστικά αυτού του τελεστή όταν οι τελεστές είναι αρνητικοί.

Για αρνητικούς ή κλασματικούς τελεστές, ο κανόνας είναι: αφαιρέστε τον δεξιό τελεστή από τον αριστερό μέχρι ο τελευταίος να είναι μικρότερος από τον πρώτο.Παραδείγματα:

17%5 = ? 17-5=12>5; 12-5=7>5; 7-5=2<5. Значит 17%5 = 2

21%7? 21-7=14>7; 14-7=7=7; 7-7=0<7. Значит 21%7 = 0

7.6%2.9? 7.6-2.9=4.7>2.9; 4.7-2.9=1.8<2.9. Значит 7.6%2.9=1.8

Σημείωση: το πρόσημο του αποτελέσματος (θετικό ή αρνητικό) καθορίζεται εξ ολοκλήρου από το πρόσημο του αριστερού τελεστή, δηλαδή το μέρισμα.

Όταν η διαίρεση συντελεστών εκτελείται σε κλασματικούς αριθμούς, η ουσία αυτής της πράξης είναι να αφαιρέσουμε τον διαιρέτη πολλές φορές. Το αποτέλεσμα μπορεί επίσης να είναι ένας κλασματικός αριθμός.

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

Η διαίρεση με δομοστοιχεία, όπως η κανονική διαίρεση, μπορεί να δημιουργήσει μια ArithmeticException εάν ο διαιρέτης (ο τελεστής δεξιά) ισούται με μηδέν.

Τελευταία ενημέρωση: 30/10/2018

Οι περισσότερες από τις λειτουργίες στην Java είναι παρόμοιες με αυτές που χρησιμοποιούνται σε άλλες γλώσσες που μοιάζουν με C. Υπάρχουν μονομερείς πράξεις (που εκτελούνται σε έναν τελεστή), δυαδικές πράξεις σε δύο τελεστές και τριαδικές πράξεις σε τρεις τελεστές. Ένας τελεστής είναι μια μεταβλητή ή μια τιμή (όπως ένας αριθμός) που εμπλέκεται σε μια πράξη. Ας εξετάσουμε όλους τους τύπους λειτουργιών.

Οι αριθμητικές πράξεις περιλαμβάνουν αριθμούς. Η Java έχει δυαδικές αριθμητικές πράξεις (που εκτελούνται σε δύο τελεστές) και μονοαριθμητικές πράξεις (εκτελούνται σε έναν τελεστή). Οι δυαδικές λειτουργίες περιλαμβάνουν τα ακόλουθα:

    λειτουργία πρόσθεσης δύο αριθμών:

    Int a = 10; int b = 7; int c = a + b; // 17 int d = 4 + b; // έντεκα

    λειτουργία αφαίρεσης δύο αριθμών:

    Int a = 10; int b = 7; int c = a - b; // 3 int d = 4 - a; // -6

    λειτουργία πολλαπλασιασμού δύο αριθμών

    Int a = 10; int b = 7; int c = a * b; // 70 int d = b * 5; // 35

    λειτουργία διαίρεσης δύο αριθμών:

    Int a = 20; int b = 5; int c = a / b; // 4 διπλό d = 22,5 / 4,5; // 5.0

    Ένα πράγμα που πρέπει να λάβετε υπόψη κατά τη διαίρεση είναι ότι εάν η πράξη περιλαμβάνει δύο ακέραιους αριθμούς, το αποτέλεσμα της διαίρεσης θα στρογγυλοποιηθεί στον πλησιέστερο ακέραιο, ακόμα κι αν το αποτέλεσμα εκχωρηθεί σε μια float ή διπλή μεταβλητή:

    Διπλό k = 10 / 4; // 2 System.out.println(k);

    Για να αντιπροσωπεύει το αποτέλεσμα έναν αριθμό κινητής υποδιαστολής, ένας από τους τελεστές πρέπει επίσης να αντιπροσωπεύει έναν αριθμό κινητής υποδιαστολής:

    Διπλό k = 10,0 / 4; // 2.5 System.out.println(k);

    λαμβάνοντας το υπόλοιπο κατά τη διαίρεση δύο αριθμών:

    Int a = 33; int b = 5; int c = a % b; // 3 int d = 22% 4; // 2 (22 - 4*5 = 2)

Υπάρχουν επίσης δύο μονομερείς αριθμητικές πράξεις που εκτελούνται σε έναν μόνο αριθμό: ++ (αύξηση) και -- (μείωση). Κάθε μια από τις λειτουργίες έχει δύο ποικιλίες: πρόθεμα και μετάθεμα:

    ++ (αύξηση προθέματος)

    Περιλαμβάνει αύξηση μιας μεταβλητής κατά ένα, για παράδειγμα z=++y (πρώτα η τιμή της μεταβλητής y αυξάνεται κατά 1 και μετά η τιμή της εκχωρείται στη μεταβλητή z)

    Int a = 8; int b = ++a; System.out.println(a); // 9 System.out.println(b); // 9

    ++ (αύξηση postfix)

    Αντιπροσωπεύει επίσης μια αύξηση σε μια μεταβλητή κατά ένα, για παράδειγμα z=y++ (πρώτα η τιμή της μεταβλητής y εκχωρείται στη μεταβλητή z και στη συνέχεια η τιμή της μεταβλητής y αυξάνεται κατά 1)

    Int a = 8; int b = a++; System.out.println(a); // 9 System.out.println(b); // 8

    -- (μείωση προθέματος)

    μείωση μιας μεταβλητής κατά ένα, για παράδειγμα, z=--y (πρώτα η τιμή της μεταβλητής y μειώνεται κατά 1 και μετά η τιμή της εκχωρείται στη μεταβλητή z)

    Int a = 8; int b = --a; System.out.println(a); // 7 System.out.println(b); // 7

    -- (μείωση postfix)

    z=y-- (πρώτα η τιμή της μεταβλητής y εκχωρείται στη μεταβλητή z και μετά η τιμή της μεταβλητής y μειώνεται κατά 1)

    Int a = 8; int b = a--; System.out.println(a); // 7 System.out.println(b); // 8

Προτεραιότητα αριθμητικών πράξεων

Ορισμένες λειτουργίες έχουν υψηλότερη προτεραιότητα από άλλες και επομένως εκτελούνται πρώτες. Πράξεις με φθίνουσα σειρά προτεραιότητας:

++ (αύξηση), -- (μείωση)

* (πολλαπλασιασμός), / (διαίρεση), % (υπόλοιπο διαίρεσης)

+ (προσθήκη), - (αφαίρεση)

Η προτεραιότητα των πράξεων θα πρέπει να λαμβάνεται υπόψη κατά την εκτέλεση ενός συνόλου αριθμητικών παραστάσεων:

Int a = 8; int b = 7; int c = a + 5 * ++b; System.out.println(c); // 48

Πρώτα θα εκτελεστεί η λειτουργία αύξησης ++b, η οποία έχει μεγαλύτερη προτεραιότητα - θα αυξήσει την τιμή της μεταβλητής b και θα την επιστρέψει ως αποτέλεσμα. Στη συνέχεια εκτελείται ο πολλαπλασιασμός 5 * ++b και μόνο στο τέλος γίνεται η πρόσθεση a + 5 * ++b

Οι παρενθέσεις σας επιτρέπουν να επαναπροσδιορίσετε τη σειρά των υπολογισμών:

Int a = 8; int b = 7; int c = (a + 5) * ++b; System.out.println(c); // 104

Παρόλο που η πράξη πρόσθεσης έχει χαμηλότερη προτεραιότητα, θα εκτελεστεί πρώτα η πρόσθεση και όχι ο πολλαπλασιασμός, καθώς η πράξη πρόσθεσης περικλείεται σε παρένθεση.

Συνεταιρισμός λειτουργιών

Εκτός από την προτεραιότητα, οι λειτουργίες διαφέρουν σε μια τέτοια έννοια όπως συνειρμικότητα. Όταν οι πράξεις έχουν την ίδια προτεραιότητα, η σειρά αξιολόγησης καθορίζεται από τη συνειρμότητα των φορέων. Ανάλογα με τη συσχέτιση, υπάρχουν δύο τύποι τελεστών:

    Αριστεροί τελεστές, οι οποίοι εκτελούνται από αριστερά προς τα δεξιά

    Δεξιά συσχετιζόμενοι τελεστές, οι οποίοι εκτελούνται από τα δεξιά προς τα αριστερά

Έτσι, ορισμένες πράξεις, όπως ο πολλαπλασιασμός και η διαίρεση, έχουν την ίδια προτεραιότητα. Ποιο θα είναι τότε το αποτέλεσμα στην έκφραση:

Int x = 10 / 5 * 2;

Πρέπει να ερμηνεύσουμε αυτήν την έκφραση ως (10 / 5) * 2 ή ως 10 / (5 * 2); Εξάλλου, ανάλογα με την ερμηνεία, θα έχουμε διαφορετικά αποτελέσματα.

Επειδή όλοι οι αριθμητικοί τελεστές (εκτός από το πρόθεμα αύξησης και μείωσης) είναι αριστεροσυσχετιστικοί, δηλαδή εκτελούνται από αριστερά προς τα δεξιά. Επομένως, η έκφραση 10 / 5 * 2 πρέπει να ερμηνευτεί ως (10 / 5) * 2, δηλαδή το αποτέλεσμα θα είναι 4.

Πράξεις κινητής υποδιαστολής

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

Διπλό d = 2,0 - 1,1; System.out.println(d);

Σε αυτήν την περίπτωση, η μεταβλητή d δεν θα είναι ίση με 0,9, όπως θα μπορούσε να υποθέσει κανείς αρχικά, αλλά 0,8999999999999999. Αυτά τα σφάλματα ακρίβειας προκύπτουν επειδή σε χαμηλό επίπεδο, το δυαδικό σύστημα χρησιμοποιείται για την αναπαράσταση αριθμών κινητής υποδιαστολής, αλλά δεν υπάρχει δυαδική αναπαράσταση για τον αριθμό 0,1, ούτε για άλλες κλασματικές τιμές. Επομένως, σε τέτοιες περιπτώσεις, συνήθως χρησιμοποιείται η κλάση BigDecimal, η οποία σας επιτρέπει να παρακάμψετε τέτοιες καταστάσεις.