for (size_t i = N ; i <= N ; i--) { .... }
Dies würde es tun, weil size_t ein unsigned int ist. Unsigned Ints sind 32bits. Wenn die Variable i den Wert 0 hat, soll Ihre Schleife die Bedingung ausführen. Wenn Sie i-- ausführen, wird der Computer
00000000000000000000000000000000
-00000000000000000000000000000001
, die in einem klaren Überlauf ergibt einen Wert von 111.111.111 geben ... 1. Für eine vorzeichenbehaftete Zweierkomplement-Ganzzahl ist dieser Wert eindeutig negativ. Allerdings ist der Typ von i ein vorzeichenloser Int, so dass der Computer 111111 ... 1 als sehr großen positiven Wert interpretiert.
So haben Sie ein paar Optionen:
1) Machen Sie es wie oben und die Schleife machen beenden, wenn ein Überlauf auftritt.
2) Machen Sie die Schleife von i = 0 bis i < = N, aber verwenden Sie (N-i) anstelle von i überall in Ihrer Schleife. Zum Beispiel würde myArray [i] myArray [N-i] werden (um eins nach unten, abhängig davon, was der Wert von N tatsächlich darstellt).
3) Machen Sie die Bedingung Ihrer for-Schleife auszunutzen die Priorität des unären - Betreibers. Als ein anderer Benutzer geschrieben,
for (size_t i = N + 1 ; i-- > 0 ;) { ... }
Dies wird i auf N + 1, überprüfen, ob die Bedingung N + 1> 0 gilt nach wie vor. Es tut, aber ich habe einen Nebeneffekt, also wird der Wert von i zu i = N dekrementiert. Mach weiter, bis du zu i = 1 kommst. Die Bedingung wird Test sein, 1> 0 ist wahr, der Nebeneffekt tritt auf , dann ist i = 0 und es wird ausgeführt.
Hmm das ist eine wirklich gute Frage. –
'size_t' ist garantiert unsigniert und Ihre Verwendung von' (size_t) -1' ist korrekt. Sie haben nur ein Problem, wenn N diesem Wert entspricht ... –
Wie wäre es mit {} while (i--)? – supercat