sizeof
gibt eine vorzeichenlose Ganzzahl zurück, daher ist TOTAL_ELEMENTS
ebenfalls vorzeichenlos.
d
ist signiert. Anfänglich ist d
-1
. Wenn Sie jedoch den Vergleich durchführen, wird d
implizit typecast zu unsigned, so dass es nicht mehr -1
ist, wenn es mit TOTAL_ELEMENTS
verglichen wird, ist es tatsächlich UINT_MAX
(das ist 4294967295
auf meiner Maschine, könnte aber für andere abweichen).
Auch
Wenn Sie dieses Problem beheben möchten, typisieren TOTAL_ELEMENTS
zu int
:
for(d = -1; d <= (int)(TOTAL_ELEMENTS - 2); d++)
Dieser Druck wird:
23
34
12
17
204
99
16
Wie man erwarten würde. Sie können auch unter Comparison operation on unsigned and signed integers nach weiteren Informationen zum Thema Signed-Unsigned-Vergleiche suchen.
Es ist erwähnenswert, dass auf Compiler-Warnungen drehen würde haben Sie herausfinden, geholfen, was los war (wie durch hyde in seiner comment beobachtet):
$ gcc -Wall -Wextra test.c
test.c:7:17: warning: comparison of integers of different signs: 'int' and 'unsigned long' [-Wsign-compare]
for(d = 0; d < TOTAL_ELEMENTS; d++)
~^~~~~~~~~~~~~~~
1 warning generated.
Alternativ, warum nicht d
starten unter 0
und laufen zu TOTAL_ELEMENTS - 1
stattdessen? Sie können sogar die Typumwandlung löschen, die nur für den Eckfall d = -1
erforderlich ist.
for(d = 0; d < TOTAL_ELEMENTS; d++)
printf("%d\n", array[d]);
Als Fußnote, hier sind die entsprechenden C99 Standard-Auszüge:
6.3.1.8p2 definiert die Umwandlung von in unsigned Typ unterzeichnet.
Wenn der Operand, der unsigned integer Typ hat Rang größer oder gleich dem Rang des Typs des anderen Operanden aufweist, dann der Operand mit signierten Integer-Typ auf den Typ des Operanden mit unsigned integer umgewandelt Art.
6.3.1.3p2 definiert, wie die Konvertierung abgeschlossen ist: Durch UINT_MAX + 1
zu der signierten Darstellung hinzufügen.
Wenn der neue Typ unsigned ist, wird der Wert durch wiederholte umgewandeltes Hinzufügen oder ein mehr als der Maximalwert Subtraktion, die in dem neuen Typ dargestellt werden kann, bis der Wert in dem Bereich des neuen Typs.
So -1
=>-1 + (UINT_MAX + 1)
= UINT_MAX
, für dieses Szenario.
Ein Makro mit einem hartcodierten Variablennamen verlangt Probleme. – jackarms
Ändern von 'd = 0 'gibt zwar Dinge aus –
@TonyTannous, aber es erklärt nicht, was das Problem in der OP ist – CIsForCookies