
Πότε είναι κατάλληλη για να χρησιμοποιήσετε ένα ανυπόγραφο μεταβλητής πάνω από ένα υπογεγραμμένο ένα; Τι γίνεται σε ένα `for`βρόχο;


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



```
for (unsigned int i = 0; i < someThing.length(); i++) {  
    SomeThing var = someThing.at(i);  
    // You get the idea.  
}

```

Ξέρω Java δεν έχει ανυπόγραφο τιμές, και ότι πρέπει να ήταν μια συνειδητή απόφαση για [Sun Microsystems](https://en.wikipedia.org/wiki/Sun_Microsystems) μέρος ».

 
Πότε να χρησιμοποιήσετε το ανυπόγραφο τιμές πάνω από υπέγραψαν αυτά;
====================================================================



Ήμουν στην ευχάριστη θέση να βρουν [μια καλή συζήτηση](http://coding.derkeiler.com/Archive/C_CPP/comp.lang.c/2004-02/1382.html) για το θέμα αυτό, όπως δεν είχα πραγματικά δοθεί πολλή σκέψη πριν.


Εν ολίγοις, η οποία υπεγράφη είναι μια καλή γενική επιλογή - ακόμα και όταν είστε νεκροί βέβαιοι ότι όλοι οι αριθμοί είναι θετικές - αν πρόκειται να κάνετε αριθμητικές πράξεις με τη μεταβλητή (όπως σε ένα τυπικό για την περίπτωση loop). 


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


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

 

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



```
#declare BIT1 (unsigned int 1)
#declare BIT32 (unsigned int reallybignumber)

```

Ειδικά όταν αυτές οι τιμές δεν θα αλλάξει ποτέ.


Ωστόσο, αν κάνετε ένα λογιστικό πρόγραμμα, όπου οι άνθρωποι είναι ανεύθυνοι με τα χρήματά τους και να είναι συνεχώς στο κόκκινο, θα θέλετε σίγουρα να χρησιμοποιήσει «υπέγραψε».


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

 

`size_t`είναι συχνά μια καλή επιλογή για αυτό, ή `size_type`αν χρησιμοποιείτε μια τάξη STL.

 

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


Φυσικά, είστε κατάρτιση με προειδοποιήσεις γύρισε όλη τη διαδρομή μέχρι, έτσι δεν είναι;


Και, έχετε σκεφτεί τη σύνταξη με «τη θεραπεία προειδοποιήσεις όπως σφάλματα» για να θεωρήσει ότι ένα βήμα παραπέρα;


Το μειονέκτημα με τη χρήση υπέγραψαν οι αριθμοί είναι ότι υπάρχει ο πειρασμός να τα υπερφόρτωση, έτσι ώστε, για παράδειγμα, οι τιμές 0-> n είναι η επιλογή του μενού, και -1 σημαίνει ότι τίποτα δεν επιλεγεί - και όχι τη δημιουργία μιας κατηγορίας που έχει δύο μεταβλητές, μία για δείχνουν αν έχει επιλεγεί κάτι και άλλο να αποθηκεύσετε ό, τι η επιλογή είναι. Προτού να το ξέρετε, έχετε τον έλεγχο για αρνητική σε όλη τη χώρα και ο compiler είναι διαμαρτύρονται για το πώς είστε που θέλουν να συγκρίνουν την επιλογή μενού σχέση με τον αριθμό των επιλογών μενού που έχετε - αλλά αυτό είναι επικίνδυνο επειδή είναι διαφορετικοί τύποι . Επομένως, μην το κάνετε αυτό.

 

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


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

Το πρόγραμμά μου δεν λάθη, και κατέληξα να πάρει λάθος δεδομένα στη βάση δεδομένων. Θα ήταν καλύτερα αν είχα χρησιμοποιήσει `uint`και είχε το πρόγραμμα αποτύχει.

 