Frage

Angenommen, ich habe diese (C ++ oder vielleicht C) Code:

vector<int> my_vector;
for (int i = 0; i < my_vector.size(); i++) {
    my_vector[i] = 0;
}

Ich interessiere mich nicht, wenn es richtig gemacht wird. Der wichtigste Teil ist in der for-Schleife Erklärung. Der Compiler gibt eine mit / ohne Vorzeichen passt nicht für diese, da Größe () gibt ein unsigned int, nicht unterzeichnet ein. Wie wichtig ist es i zu unsigned zu ändern? Ich erkläre Schleifenzähler als Ints aus Gewohnheit, aber wenn dies ein potentieller Fehler werde ich mich zwingen, aus der Gewohnheit zu erhalten.

War es hilfreich?

Lösung

Ich würde sagen, es ist sehr wichtig - Sie sollten mit Warnungen als Fehler kompilieren, und bemühen uns, alle Warnungen zu beheben. Wenn Sie Probleme wie diese in Ihrem Code lassen, es ist leicht, in eine Gewohnheit, Warnungen zu ignorieren, oder lassen Fehlalarme wie diese übertönen Warnungen, die wirklichen Probleme an.

In diesem Fall für diesen speziellen Fehler, ist es wahrscheinlich keine große Sache - auf einer 32-Bit-Plattform würden Sie mehr als 2 Milliarden Einträge im Vektor haben müssen, bevor die unsigned in einen negativen Wert mit Vorzeichen wickeln würde. Um einen Vektor wie dies alle Ihre Speicher erschöpfen würde, so ist es wahrscheinlich nicht möglich, in einen Zustand zu erhalten, wo mit / ohne Vorzeichen Mismatch wäre egal.

Andere Tipps

Technisch sollte i ein vector<int>::size_type sein. Sie sollten in Ihrem Code verwendet typedefs in der Gewohnheit:

typedef vector<int> VectorType;
VectorType my_vector;
for (VectorType::size_type i = 0; i < my_vector.size(); i++) {
    my_vector[i] = 0;
}

Nun, wenn wir es zu einem deque ändern, ändern wir nur eine Zeile. Auch wenn es einige benutzerdefinierte Container ist, die einen verrückten size_type hat, erhalten Sie die warme, fuzzy Gefühl, dass alles in Ordnung sein wird. Und das ist viel wert. Selbst mit nur unsigned / unterzeichnet, gibt es einige knifflige Förderung Probleme bei der Verwendung mit / ohne Vorzeichen Umwandlung, die unweigerlich zurück kommen zu Ihnen beißen.

Dies kann in dem unwahrscheinlichen Fall wichtig sein, dass die Größe des Vektors INT_MAX überschreitet. Wenn die Größe des Vektors größer als der maximale Wert ist, der in einer signierten int dargestellt werden kann, dann wird Ihre Schleife nie beenden.

Nun, es ist wichtig, weil unterzeichnete ganze Zahlen haben Zeichen, so konnte ich den ganzen Weg nach oben einen negativen Wert werden, dann, egal wie groß es ist, wäre es immer noch weniger als Größe (), die ein Zeichen haben tut.

  

11111111 <10000000

Bei den meisten Fällen von Ihrem Beispiel, wird es keine Rolle. aber wenn Ihr Programm nicht funktioniert, das erste, was Sie tun (oder sollte) ist um sicherzustellen, dass es keine Warnungen sind, so ist es eine Chance, sich nicht lohnt nehmen.

sicherstellen, dass es so wenig Warnungen wie möglich sind.

Wie oben erwähnt, verwenden Vektor :: size_type; oder einen Iterator einer Schleife durch Ihren Vektor verwenden. Achten Sie darauf, alle Ihre eigenen Warnungen als Fehler zu behandeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top