Diese Aussage
printf(" %d, %ul, %u, %d, %ul, %u", strlen(str),strlen(str),strlen(str),strlen(str)-1,strlen(str)-1,strlen(str)-1);
zeigt, dass, wenn strlen(str) - 1
wie unsigned integer beispielsweise unter Verwendung von Format-Spezifizierer %ul
seinen Wert 4294967295l
ist
outputed ist
In dem Zustand der Schleife
for (int i=0;i<strlen(str)-1;i++)
die Der Compiler muss den gemeinsamen Typ der linken und rechten Operanden bestimmen, um die Ty zu bestimmen pe des Ergebnisses der Bedingung
i<strlen(str)-1
Der rechte Operand strlen(str)-1
size_t
Typ hat (der Rückgabetyp der Funktion strlen
ist size_t
). Es ist in der Regel ein vorzeichenloser Integer-Typ, der unsigned long
entspricht. Es kann keine negativen Werte haben. Jeder Wert, der in einem Objekt dieses Typs gespeichert ist, wird als nicht-negativer Wert interpretiert und als Ausgabe zeigt der Wert strlen(str)-1
gleich 4294967295l
. (Der tatsächliche Wert kann man erhalten, wenn Sie Typspezifizierer verwendet %zu
weil nicht ausgeschlossen werden kann, dass size_t
lang sogar in unsigned long entsprechen kann)
Der rechte Operand hat int
eingeben. Ihr Rang ist mindestens nicht größer als der Rang von size_type. Daher werden die beiden Operanden in den Typ size_t
konvertiert und haben nicht negative Werte.
Diese Prozedur zur Bestimmung des gemeinsamen Typs wird als die üblichen arithmetischen Umwandlungen bezeichnet. Es ist offensichtlich, dass 4294967295l
größer als 0 ist. So wird die Schleife 4294967295l
mal durchlaufen, wenn es keine break-Anweisung hat.
Sie könnten das erwartete Ergebnis, wenn man die Bedingung in der Schleife die folgende Art und Weise
for (int i = 0; i < (int)strlen(str) - 1; i++)
Angst vor Debugger neu schreiben? Versuche zu treten! – Olaf
Ich trete auch ein. In gdb, wenn ich p strlen (str) -1 mache, gibt dies mir einen int-Wert. Ich versuche nur zu verstehen, was der Wert in der for-Schleife ist. Ich habe überprüft, dass strlen (str) 0 ist, sogar im for-loop-Zustand. strlen (str) -1 ist 4294967295 ... warum passiert das? –
Überprüfen Sie, welcher Ergebnistyp 'strlne' tatsächlich zurückgibt. Dann lesen Sie im [Standard] (http://port70.net/~nsz/c/c11/n1570.html), wie sich dieser Typ auf Unterlauf verhält (Hinweis: es ist _well defined_). Dann können Sie Ihre Frage selbst beantworten. Hinweis: "Ich" hat den falschen Typ! – Olaf