Frage

Ich fand dies in dem Code, den ich im Moment bin auf und dachte, dass es die Ursache für einige Probleme war ich mit.

In einem Header irgendwo:

enum SpecificIndexes{
    //snip
    INVALID_INDEX = -1
};

Dann später - Initialisierung:

nextIndex = INVALID_INDEX;

und verwenden

if(nextIndex != INVALID_INDEX)
{
    //do stuff
}

Sie den Code debuggen, haben die Werte in nextindex nicht ganz Sinn machen (sie waren sehr groß), und ich fand, dass es erklärt wurde:

unsigned int nextIndex;

So wird die anfängliche Einstellung INVALID_INDEX wurde Unterschreitung des unsigned int und es zu einer sehr großen Zahl zu setzen. Ich nahm an, das war, was das Problem verursacht wurde, aber genaueres Hinsehen, der Test

if(nextIndex != INVALID_INDEX)

korrekt benahm, das heißt, sie ausgeführt nie den Körper der if wenn nextindex war die „große + ve Wert“.

Ist das richtig? Wie ist das passiert? Ist der ENUM-Wert implizit auf eine unsigned int vom gleichen Typ wie die Variable gegossen wird, und somit auf die gleiche Art und Weise eingewickelt zu werden?

War es hilfreich?

Lösung

Ja, um alles. Es ist gültige Code, wird es auch Bibliothek-Seite C ++ Code häufig verwendet, um so mehr in der modernen C ++ (es seltsam ist, wenn man es zum ersten Mal, aber es ist ein sehr häufiges Muster in Wirklichkeit sehen).

Dann Aufzählungen Ints sind unterzeichnet, aber sie erhalten implizit in unsigned ints geworfen, jetzt je nach Ihrem Compiler möglicherweise eine Warnung geben, aber es ist immer noch sehr häufig verwendet, aber Sie sollten explizit werfen, um es zu Maintainer deutlich zu machen.

Andere Tipps

Aufzählungen können durch mit oder ohne Vorzeichen integrale Typen dargestellt werden je nachdem, ob sie irgendwelche negativen Werte enthalten und was der Compiler fühlt sich an wie. Das Beispiel enthält hier einen negativen Wert und muß daher von einem signierten ganzzahligen Typ dargestellt werden.

Gleichheit Vergleich zwischen mit und ohne Vorzeichen Typen ist sicher und in der Regel tut, was der Autor beabsichtigt - der Wert mit Vorzeichen in unsigned zuerst konvertiert werden, und das Ergebnis, das zu tun wird durch die C ++ definiert Standard und intuitiv ist (zumindest, es ist, wenn Sie den Zieltyp kennen. außer vielleicht, wenn ganze Zahlen Komplement nicht Zweierkomplement sind. Also vielleicht nicht so intuitiv, aber es Probleme normalerweise nicht verursachen).

Um einen Vergleich eher zu Fehlern führen. Zum Beispiel:

SpecificIndexes value = INVALID_VALUE;
return (value >= 0);

false zurück, aber:

unsigned int value = INVALID_VALUE;
return (value >= 0);

gibt true zurück. Manchmal wird der Autor nicht schätzen den Unterschied, vor allem, wenn die Art des „Wertes“ ist nicht ganz so offensichtlich an der Einsatzstelle. Der Compiler kann auch warnen vor dem zweiten Beispiel, obwohl, weil (Wert> = 0) eine Tautologie ist.

In der Tat -1 implizit auf seinen equivalente Wert ohne Vorzeichen werfen, wenn es um nextvalue zugewiesen wird. Die equivalente unsigned ist der Wert mit der gleichen bitweise Darstellung (die 111111111111 ..., das ist der maximale Wert ohne Vorzeichen).

Später, in der Vergleichsrechnung, eine andere implizite Umwandlung geschieht.

Also das jetzt funktioniert, kann aber Probleme in der Zukunft führen. Es ist nie eine gute Idee, mit und ohne Vorzeichen Werte zu mischen.

Ja, ich glaube Aufzählungen signiert sind. Ändern

unsigned int nextIndex;

int nextIndex;

und Ihr Programm sollte funktionieren.

Der C ++ Standard ermöglicht eine Implementierung ein signiertes Typ für Aufzählungen zu verwenden, aber es ist nicht erforderlich. Daher können Sie in der Regel nicht davon ausgehen, dass es sicher ist, negative Zahlen in eine ENUM zu setzen.

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