Frage

Ich möchte eine Schleife, die einen UInt16 (ushort) eine Schleife durch alle seine Werte verwendet. Allerdings bedeutet dies nicht tun:

for( ushort i = 0; i < UInt16.MaxValue; i++ )
{
    // do something
}

Das Problem ist, dass die Schleife wird beendet, wenn i == 0xFFFF und nicht „etwas tun“. Wenn ich die 'für' Aussage ändern, um "für (ushort i = 0; i <= UInt16.MaxValue; i ++)"., Dann ist es eine Endlosschleife wird, weil ich nie nur weil ushorts 0xFFFF gehen zu 0x10000 bekommt

könnte ich 'i' ein int und werfe es oder es zu einer ushort Variable in der Schleife zugeordnet werden.

Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Verwenden Sie eine do...while Schleife

ushort i = 0;
do
{
    // do something
} while(i++ < UInt16.MaxValue);

Es gibt eine interessante Diskussion über Tests an der Spitze im Vergleich zu dem unteren Schleifen hier .

Andere Tipps

UInt16.MaxValue wertet 0xffff, nicht 0x10000 . Ich glaube, Sie können dies tun, mit einer do / while Schleife, als eine Variation auf burkhard1979 Antwort.

ushort i = 0;
do {
   ...
} while (++i != 0);

Sie können einfach die ersetzen für eine do-while-Schleife.

ushort i = 0;
do
{
i++;
...
} while(i!=UInt16.MaxValue);

muss es eine kurze sein? warum nicht einfach

for(int i = 0;i<=0xFFFF;i++)
{
  //do whatever
}

Unter der Annahme, dass der Code durch einen Fehler von einem Aus leidet (die aktuelle Code, stoppt kurz vor dem endgültigen Wert ausgewertet hat. Dann wird die folgende könnten Sie beantworten.

Sehr einfach, als Zähler ein 16-Bit-Integer ohne Vorzeichen ist, kann es nicht haben Werte größer als 0xffff, da dieser Wert noch gültig ist, müssen Sie einen Wert haben, der darüber hinaus als Wache erstreckt. Jedoch Zugabe 1 in 16 Bit 0xffff nur umschlingt 0. Wie vorgeschlagen, entweder ein Verwenden while-Schleife (das nicht einen Schutzwert benötigen) oder einen größeren Wert verwenden, um Ihre Zähler zu enthalten.

ps. Mit 16-Bit-Variablen auf moderne Maschinen ist tatsächlich weniger effizient als die Verwendung von 32-Bit-Variablen wie kein Überlauf-Code generiert werden muss.

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