Ποια είναι η διαφορά μεταξύ ++ a και a ++ σε μια γλώσσα προγραμματισμού;


Απάντηση 1:

Στη γλώσσα προγραμματισμού αυτά τα δύο καλούνται ως προ (++ a) και post (a ++) δηλώσεις αύξησης.

Επιτρέψτε μου να σας δώσω ένα παράδειγμα,

α = 0, b = 0,

για (i = 0, i <= 5; i ++) {// loop για 5 φορές

printf ("% d", ++ α); // αυτό θα εκτυπώσει "1 2 3 4 5"

printf ("% d", b ++). // και αυτό θα είναι "0 1 2 3 4"

}}

Σε ++ α, μια τιμή θα είναι η πρώτη αύξηση και στη συνέχεια θα εκχωρηθεί

+ α -> προσαύξηση -> εκχώρηση

Ενώ στο b ++, η τιμή b θα εκχωρηθεί πρώτα και στη συνέχεια θα αυξηθεί

α ++ -> εκχώρηση -> προσαύξηση


Απάντηση 2:

Στο παρελθόν, οι μεταγλωττιστές δεν ήταν τόσο έξυπνοι και χρησιμοποιώντας ++ & - θα μπορούσαν να βοηθήσουν έναν μεταγλωττιστή να παράγει καλύτερο κώδικα μηχανής.

+ + βήματα και σας δίνει την τιμή, και ένα ++ σας δίνει την τιμή τότε αυξήσεις. Από μόνα τους δεν υπάρχει διαφορά, αλλά είναι σε μια έκφραση είναι διαφορετικές.

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

Μια στοίβα είναι μια κοινή δομή δεδομένων, αλλά υπάρχουν 2 επιλογές:

int στοίβα [100]; // η στοίβα μου των αριθμών θα αποθηκευτεί εδώ * κορυφή = & στοίβα [0]; // Το top-of-stack ρυθμίζεται κάθε φορά που χρησιμοποιείται

// Μέθοδος 1: κορυφή είναι όπου κάτι νέο θα είναι PUSHED * κορυφή ++ = κάτι? // PUSH κάτι τότε αυξάνει κάτι = * -top; // decrement τότε POP η κορυφαία τιμή

// Μέθοδος 2: κορυφή είναι όπου κάτι παλιό θα είναι POPPED * ++ top = κάτι; // αύξηση τότε PUSH κάτι = * κορυφή-? // POP τότε μείωση

Ορισμένοι μεταγλωττιστές CPU μπορούν να μετατρέψουν μερικά από αυτά σε αποδοτικές μόνο οδηγίες.

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

αν (-a> 0) πήρε ετικέτα.

θα μπορούσε να μετατραπεί σε μια ενιαία εντολή CPU όπως

djnz reg1, διεύθυνση; decrement register, άλμα αν όχι μηδέν για να αντιμετωπίσει

Αλλά μια CPU μπορεί να μην έχει ενσωματωμένη οδηγία για:

αν (a-> 0) πήρε ετικέτα.

που μπορεί να μετατραπεί σε κάτι σαν το

μετακίνηση reg1, reg2decrement διεύθυνση reg1test reg2jnz

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


Απάντηση 3:

Στο παρελθόν, οι μεταγλωττιστές δεν ήταν τόσο έξυπνοι και χρησιμοποιώντας ++ & - θα μπορούσαν να βοηθήσουν έναν μεταγλωττιστή να παράγει καλύτερο κώδικα μηχανής.

+ + βήματα και σας δίνει την τιμή, και ένα ++ σας δίνει την τιμή τότε αυξήσεις. Από μόνα τους δεν υπάρχει διαφορά, αλλά είναι σε μια έκφραση είναι διαφορετικές.

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

Μια στοίβα είναι μια κοινή δομή δεδομένων, αλλά υπάρχουν 2 επιλογές:

int στοίβα [100]; // η στοίβα μου των αριθμών θα αποθηκευτεί εδώ * κορυφή = & στοίβα [0]; // Το top-of-stack ρυθμίζεται κάθε φορά που χρησιμοποιείται

// Μέθοδος 1: κορυφή είναι όπου κάτι νέο θα είναι PUSHED * κορυφή ++ = κάτι? // PUSH κάτι τότε αυξάνει κάτι = * -top; // decrement τότε POP η κορυφαία τιμή

// Μέθοδος 2: κορυφή είναι όπου κάτι παλιό θα είναι POPPED * ++ top = κάτι; // αύξηση τότε PUSH κάτι = * κορυφή-? // POP τότε μείωση

Ορισμένοι μεταγλωττιστές CPU μπορούν να μετατρέψουν μερικά από αυτά σε αποδοτικές μόνο οδηγίες.

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

αν (-a> 0) πήρε ετικέτα.

θα μπορούσε να μετατραπεί σε μια ενιαία εντολή CPU όπως

djnz reg1, διεύθυνση; decrement register, άλμα αν όχι μηδέν για να αντιμετωπίσει

Αλλά μια CPU μπορεί να μην έχει ενσωματωμένη οδηγία για:

αν (a-> 0) πήρε ετικέτα.

που μπορεί να μετατραπεί σε κάτι σαν το

μετακίνηση reg1, reg2decrement διεύθυνση reg1test reg2jnz

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