53 Stimmen

Warum wird in C und C++ für for-Schleifen eher int als unsigned int verwendet?

Dies ist eine eher dumme Frage, aber warum ist int üblicherweise verwendet anstelle von unsigned int bei der Definition einer for-Schleife für ein Array in C oder C++?

for(int i;i<arraySize;i++){}
for(unsigned int i;i<arraySize;i++){}

Ich erkenne die Vorteile der Verwendung von int wenn man etwas anderes als Array-Indizierung macht und die Vorteile eines Iterators bei der Verwendung von C++-Containern. Ist es nur, weil es keine Rolle, wenn Schleife durch ein Array? Oder sollte ich es ganz vermeiden und einen anderen Typ verwenden, wie z. B. size_t ?

1voto

Jonathan Grynspan Punkte 43004

Das hängt wirklich vom Programmierer ab. Manche Programmierer bevorzugen den Perfektionismus des Typs, so dass sie den Typ verwenden, mit dem sie gerade vergleichen. Wenn sie zum Beispiel durch eine C-Zeichenkette iterieren, könnten Sie sehen:

size_t sz = strlen("hello");
for (size_t i = 0; i < sz; i++) {
    ...
}

Wenn sie etwas nur 10 Mal tun, werden Sie wahrscheinlich immer noch sehen int :

for (int i = 0; i < 10; i++) {
    ...
}

0voto

Claudiu Punkte 215027

Ich benutze int weil es weniger physische Typisierung erfordert und es keine Rolle spielt - sie nehmen die gleiche Menge an Platz ein, und wenn Ihr Array nicht ein paar Milliarden Elemente hat, werden Sie nicht überlaufen, wenn Sie keinen 16-Bit-Compiler verwenden, was ich normalerweise nicht tue.

0voto

Shahbaz Punkte 44492

Denn wenn Sie kein Array mit einer Größe von mehr als zwei Gigabyte vom Typ char oder 4 Gigabyte des Typs short oder 8 Gigabyte des Typs int usw., spielt es keine Rolle, ob die Variable vorzeichenbehaftet ist oder nicht.

Warum also mehr tippen, wenn man weniger tippen kann?

0voto

Jonathan Wood Punkte 61798

Abgesehen davon, dass es kürzer zu tippen ist, liegt der Grund darin, dass es negative Zahlen erlaubt.

Da wir nicht im Voraus sagen können, ob ein Wert jemals negativ sein kann, nehmen die meisten Funktionen, die ganzzahlige Argumente annehmen, die vorzeichenbehaftete Variante. Da die meisten Funktionen vorzeichenbehaftete Ganzzahlen verwenden, ist es oft weniger aufwändig, vorzeichenbehaftete Ganzzahlen für Dinge wie Schleifen zu verwenden. Andernfalls besteht die Gefahr, dass Sie eine Reihe von Typecasts hinzufügen müssen.

Mit dem Übergang zu 64-Bit-Plattformen sollte der vorzeichenlose Bereich einer vorzeichenbehafteten Ganzzahl für die meisten Zwecke mehr als ausreichend sein. In diesen Fällen gibt es keinen Grund, nicht eine vorzeichenbehaftete Ganzzahl zu verwenden.

0voto

Infinite Punkte 2968

Betrachten Sie das folgende einfache Beispiel:

int max = some_user_input; // or some_calculation_result
for(unsigned int i = 0; i < max; ++i)
    do_something;

Si max ein negativer Wert, z. B. -1, ist, wird die -1 gilt als UINT_MAX (wenn zwei ganze Zahlen mit gleichem Rang, aber unterschiedlichem Vorzeichen verglichen werden, wird die vorzeichenbehaftete Zahl als vorzeichenlose Zahl behandelt). Der folgende Code hingegen würde dieses Problem nicht haben:

int max = some_user_input;
for(int i = 0; i < max; ++i)
    do_something;

Geben Sie eine negative max eingeben, wird die Schleife sicher übersprungen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X