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

Βρόχο, εναλλαγή ή διάλειμμα; Αποφάσεις και επανάληψη με τις δηλώσεις Java

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

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

Σε αυτό το σεμινάριο, θα μάθετε πώς να χρησιμοποιείτε δηλώσεις στα προγράμματα Java. Μπορείτε να χρησιμοποιήσετε δηλώσεις όπως αν, αν-αλλιώς, διακόπτης, Για, και ενώ για να δηλώσετε μεταβλητές και να καθορίσετε εκφράσεις, να λάβετε αποφάσεις, να επαναλάβετε τις δηλώσεις, να διακόψετε και να συνεχίσετε την επανάληψη και πολλά άλλα. Θα αφήσω μερικές από τις πιο εξωτικές δηλώσεις - όπως δηλώσεις για την επιστροφή τιμών από μεθόδους που ονομάζονται και για εξαιρέσεις - για μελλοντικά προγράμματα εκμάθησης Java 101.

Εναλλαγή εκφράσεων στην Java 12

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

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

Μεταβλητές δηλώσεις και αναθέσεις

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

int ηλικία = 25; επιτόκιο char [] text = {'J', 'a', 'v', 'a'}; Όνομα συμβολοσειράς;

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

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

ηλικία = 30; interest_rate = 4.0F; ηλικία + = 10; κείμενο [1] = "A"; κείμενο [2] = 'V'; κείμενο [3] = "A"; όνομα = "John Doe";

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

  • Προαύξηση (π.χ. ++ x;)
  • Προκαθορισμός (π.χ., - ε;)
  • Μετά την αύξηση (π.χ., x ++;)
  • Postdecrement (π.χ., y--;)
  • Μέθοδος κλήσης (π.χ. System.out.println ("Γεια");)
  • Δημιουργία αντικειμένων (π.χ. νέα συμβολοσειρά ("ABC") ·)

Μεταβλητές δηλώσεις με jshell

Μπορείς να χρησιμοποιήσεις jshell να πειραματιστείτε με μεταβλητές δηλώσεις και δηλώσεις έκφρασης. Ακολουθούν ορισμένα παραδείγματα για να ξεκινήσετε (ανατρέξτε στην ενότητα "Μάθετε Java από το μηδέν" για μια εισαγωγή στο Java Shell):

jshell> int age = 25 age ==> 25 jshell> float interest_rate interest_rate ==> 0,0 jshell> char [] text = {'J', 'a', 'v', 'a'} text ==> char [ 4] {'J', 'a', 'v', 'a'} jshell> Όνομα συμβολοσειράς ==> null jshell> age = 30 age ==> 30 jshell> interest_rate = 4.0F interest_rate ==> 4.0 jshell > ηλικία + = 10 $ 7 ==> 40 jshell> κείμενο [1] = 'A' $ 8 ==> 'A' jshell> κείμενο [2] = 'V' $ 9 ==> 'V' jshell> κείμενο [3] = 'A' $ 10 ==> 'A' jshell> name = "John Doe" name ==> "John Doe" jshell> text text ==> char [4] {'J', 'A', 'V' , 'A'} jshell> ηλικία ++ $ 13 ==> 40 jshell> ηλικία ==> 41

Σημειώσε ότι ηλικία ++ δεν φαίνεται να έχει καταφέρει τίποτα. Εδώ, το βλέπεις 40 έχει εκχωρηθεί στη μεταβλητή μηδέν $13. Ωστόσο, ο τελεστής μετά την αύξηση πραγματοποιεί την αύξηση μετά την επιστροφή της τρέχουσας τιμής. (Στην πραγματικότητα, αποθηκεύει την τρέχουσα τιμή κάπου, εκτελεί την αύξηση και, στη συνέχεια, επιστρέφει την αποθηκευμένη τιμή.) Εισαγωγή ηλικία το αποδεικνύει αυτό ηλικία περιέχει 41, το αποτέλεσμα της πράξης μετά την αύξηση.

Το Java Shell παρέχει διάφορες εντολές και λειτουργίες που απλοποιούν την εργασία με αποσπάσματα. Για παράδειγμα, το /λίστα Η εντολή εμφανίζει όλα τα αποσπάσματα που έχουν εισαχθεί στην τρέχουσα περίοδο λειτουργίας:

jshell> / λίστα 1: int age = 25; 2: ρυθμός ενδιαφέροντος 3: char [] text = {'J', 'a', 'v', 'a'}; 4: Όνομα συμβολοσειράς. 5: age = 30 6: interest_rate = 4.0F 7: age + = 10 8: text [1] = 'A' 9: text [2] = 'V' 10: text [3] = 'A' 11: όνομα = "John Doe" 12: κείμενο 13: ηλικία ++ 14: ηλικία

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

jshell> / 12 text text ==> char [4] {'J', 'A', 'V', 'A'} jshell> / λίστα 13 13: age ++ jshell> / drop 7 | έπεσε μεταβλητή $ 7 jshell> / list 1: int age = 25; 2: ρυθμός ενδιαφέροντος 3: char [] text = {'J', 'a', 'v', 'a'}; 4: Όνομα συμβολοσειράς. 5: ηλικία = 30 6: interest_rate = 4.0F 8: text [1] = 'A' 9: text [2] = 'V' 10: text [3] = 'A' 11: name = "John Doe" 12 : κείμενο 13: ηλικία ++ 14: ηλικία 15: κείμενο

Εδώ μπήκαμε /12 για να εκτελέσετε ξανά το απόσπασμα # 12, το οποίο εξάγει τα περιεχόμενα του κείμενο. Στη συνέχεια μπήκαμε / λίστα 13 για να παραθέσετε το απόσπασμα # 13, το οποίο αυξάνεται ηλικία. Στη συνέχεια, μπήκαμε / πτώση 7 για να διαγράψετε το απόσπασμα # 7 (όχι περισσότερο ηλικία + = 10 απόσπασμα). Τέλος, μπήκαμε /λίστα για να καταχωρίσετε ξανά όλα τα αποσπάσματα. Παρατηρήστε ότι το απόσπασμα # 7 έχει αφαιρεθεί και ένα απόσπασμα # 15 έχει προστεθεί χάρη στο /12 εντολή.

Λήψη αποφάσεων: εάν, εάν-αλλιώς, και εναλλαγή

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

Η Java υποστηρίζει το αν, αν-αλλιώς, και διακόπτης δηλώσεις αποφάσεων. Επιπλέον, ένα νέο διακόπτης Η δυνατότητα εκφράσεων προστέθηκε στην Java 12.

Η δήλωση if

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

αν (Boolean έκφραση) δήλωση

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

Το ακόλουθο παράδειγμα δείχνει το αν δήλωση. Οταν ο ηλικία η μεταβλητή περιέχει τιμή 55 ή μεγαλύτερη, αν εκτελεί System.out.println (...); για έξοδο του μηνύματος:

if (ηλικία> = 55) System.out.println ("Είστε ή δικαιούστε πρόωρη συνταξιοδότηση.");

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

if (ηλικία> = 55) {System.out.println ("Είστε ή δικαιούστε πρόωρη συνταξιοδότηση."); }

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

Πειραματιστείτε με δηλώσεις if

Ας δοκιμάσουμε αυτό το παράδειγμα χρησιμοποιώνταςjshell. Επανεκκίνηση jshell και μετά εισαγάγετε ένα ηλικία μεταβλητή (τύπου) int) που αρχικοποιήθηκε σε 55:

jshell> int ηλικία = 55 ετών

Στη συνέχεια, εισαγάγετε το πρώτο παράδειγμα αν δήλωση (χωρίς τα σγουρά στηρίγματα που περιβάλλουν το σώμα του):

jshell> if (ηλικία> = 55) ...> System.out.println ("Είστε ή δικαιούστε πρόωρη συνταξιοδότηση."); Είστε ή δικαιούστε πρόωρη συνταξιοδότηση. jshell>

Παρατηρήστε ότι το jshell> άμεσες αλλαγές στο ...> προτροπή συνέχισης όταν εισαγάγετε ένα απόσπασμα πολλαπλών γραμμών. Πάτημα Εισαγω μετά την τελευταία αιτία γραμμής αποσπάσματος jshell για να εκτελέσετε αμέσως το απόσπασμα.

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

Τώρα, ας υποθέσουμε ότι εκχωρείτε 25 προς την ηλικία και μετά εκτελέστε ξανά /2 (ή τον αντίστοιχο αριθμό αποσπάσματος στη συνεδρία σας). Αυτή τη φορά, δεν πρέπει να παρατηρήσετε το μήνυμα στην έξοδο.

Η δήλωση if-else

ο αν-αλλιώς Η δήλωση αξιολογεί μια έκφραση Boolean και εκτελεί μια δήλωση. Η δήλωση που εκτελείται εξαρτάται από το εάν η έκφραση αξιολογείται ως αληθής ή ψευδής. Εδώ είναι η σύνταξη για το αν-αλλιώς δήλωση:

αν (Boolean έκφραση) δήλωση1 αλλού δήλωση2

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

Το ακόλουθο παράδειγμα δείχνει ένα αν-αλλιώς δήλωση που λέει σε κάποιον που είναι κάτω των 55 ετών πόσα χρόνια απομένουν μέχρι την πρόωρη συνταξιοδότηση:

if (ηλικία> = 55) System.out.println ("Είστε ή δικαιούστε πρόωρη συνταξιοδότηση."); αλλιώς System.out.println ("Έχετε" + (55 - ηλικία) + "χρόνια για να φτάσετε μέχρι την πρόωρη συνταξιοδότηση.");

Υπό όρους χειριστής εναντίον if-else

Ο τελεστής υπό όρους (?:) είναι παρόμοιο με ένα αν-αλλιώς δήλωση. Ωστόσο, αυτός ο τελεστής δεν μπορεί να χρησιμοποιηθεί για την εκτέλεση εναλλακτικών δηλώσεων. Αντ 'αυτού, μπορεί να επιστρέψει μόνο μία από τις δύο τιμές του ίδιου τύπου. (Ο υπό όρους τελεστής είναι επίσης μερικές φορές γνωστός ως τριαδικός χειριστής.)

Αλυσίδα δηλώσεων if-else

Η Java σάς επιτρέπει να κάνετε πολλαπλές αλυσίδες αν-αλλιώς δηλώσεις μαζί για καταστάσεις όπου πρέπει να επιλέξετε μία από τις πολλαπλές δηλώσεις για εκτέλεση:

αν (Boolean έκφραση) δήλωση1 αλλιως αν (Δυαδική έκφραση2) δήλωση2 αλλιώς ... αλλιώς δήλωσηN

Η αλυσίδα λειτουργεί με την εκτέλεση ενός επόμενου αν-αλλιώς δήλωση όποτε το τρέχον αν Η έκφραση Boolean της δήλωσης αξιολογείται ως false. Εξετάστε μια επίδειξη:

εάν (θερμοκρασία 100.0) System.out.println ("βρασμός"); αλλιώς System.out.println ("normal");

Ο πρώτος αν-αλλιώς Η δήλωση καθορίζει εάν θερμοκρασίαΗ τιμή είναι αρνητική. Εάν ναι, εκτελείται System.out.println ("κατάψυξη");. Εάν όχι, εκτελεί ένα δευτερόλεπτο αν-αλλιώς δήλωση.

Το δεύτερο αν-αλλιώς Η δήλωση καθορίζει εάν θερμοκρασίαΗ τιμή είναι μεγαλύτερη από 100. Εάν ναι, εκτελείται System.out.println ("βρασμός");. Διαφορετικά, εκτελεί System.out.println ("κανονικό");.

Το πρόβλημα που κρέμεται-αλλιώς

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

int x = 0; int y = 2; if (x> 0) if (y> 0) System.out.println ("x> 0 και y> 0"); αλλιώς System.out.println ("x <= 0");

Πιθανότατα θα περίμενε κανείς να δει x <= 0 ως έξοδος από αυτόν τον κώδικα, αλλά δεν θα συμβεί ποτέ. Αντίθετα, τίποτα δεν θα εμφανιστεί. Το πρόβλημα είναι ότι το αλλού ταιριάζει με το πλησιέστερο αν, το οποίο είναι εάν (y> 0). Η αναδιαμόρφωση του κώδικα καθιστά σαφέστερο τι συμβαίνει:

int x = 0; int y = 2; if (x> 0) if (y> 0) System.out.println ("x> 0 και y> 0"); αλλιώς System.out.println ("x <= 0");

Εδώ είναι καθαρότερο από ένα αν (y> 0) ... αλλιώς ...αν-αλλιώς η δήλωση ακολουθεί το εάν (x> 0) δήλωση. Για να ταιριάζει με την πρόθεση του προηγούμενου παραδείγματος, πρέπει να εισαγάγετε χαρακτήρες αγκύρωσης εάν (y> 0) και την επακόλουθη δήλωσή του. Ουσιαστικά, θα ακολουθήσει ένα μπλοκ εάν (x> 0):

int x = 0; int y = 2; if (x> 0) {if (y> 0) System.out.println ("x> 0 και y> 0"); } άλλο System.out.println ("x <= 0");

Επειδή x> 0 αξιολογεί σε ψευδές, System.out.println ("x <= 0"); εκτελεί. ο αλλού Η δεσμευμένη λέξη ταιριάζει ξεκάθαρα με εάν (x> 0).

Η δήλωση διακόπτη

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

διακόπτης (έκφραση επιλογέα) { υπόθεση τιμή1: δήλωση1 [διάλειμμα;] υπόθεση τιμή2: δήλωση2 [διάλειμμα;] ... υπόθεση τιμήΝ: δήλωσηN [break;] [προεπιλογή: δήλωση] }

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

Διακόπτες εναλλαγής και φωτισμού

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

Κάθε περίπτωση προσδιορίζει μια δήλωση προς εκτέλεση. Η υπόθεση ξεκινά με την δεσμευμένη λέξη υπόθεση και μια τιμή που επισημαίνει την υπόθεση. Μετά από άνω και κάτω τελεία (:) χαρακτήρας είναι η δήλωση προς εκτέλεση. Η δήλωση μπορεί προαιρετικά να ακολουθηθεί από Διακοπή;, για να μεταφέρετε την εκτέλεση στην πρώτη δήλωση μετά διακόπτης. Εάν καμία από τις ετικέτες πεζών δεν ταιριάζει με την τιμή της έκφρασης επιλογέα, η προαιρετική προεπιλεγμένη περίπτωση, η οποία ξεκινά με δεσμευμένη λέξη Προκαθορισμένο, θα εκτελέσει.

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

int i = 27; διακόπτης (i% 2) {case 0: System.out.println ("even"); Διακοπή; περίπτωση 1: System.out.println ("odd"); }
$config[zx-auto] not found$config[zx-overlay] not found