11 Stimmen

Wie funktioniert dieser C-Code?

Ich habe mir den folgenden Code angesehen, auf den ich gestoßen bin, um eine Zeichenkette in umgekehrter Reihenfolge in C unter Verwendung von Rekursion zu drucken:

void ReversePrint(char *str) { //line 1
  if(*str) {                   //line 2
      ReversePrint(str+1);     //line 3
      putchar(*str);           //line 4
  }
}

Ich bin relativ neu in C und bin durch Zeile 2 verwirrt. *str ist nach meinem Verständnis eine Dereferenzierung des Zeigers und sollte den Wert der Zeichenfolge an der aktuellen Position zurückgeben. Aber wie wird dies als ein Argument für eine bedingte Anweisung (die außer einem booleschen Recht sollte?) verwendet werden? In Zeile 3 wird der Zeiger immer auf den nächsten Block inkrementiert (4 Bytes, da es sich um einen int handelt)... könnte dieser Code also nicht fehlschlagen, wenn sich im nächsten Speicherblock nach dem Ende der Zeichenfolge zufällig Daten befinden?

Update : Es gibt also keine booleschen Typen in C, richtig? Eine bedingte Anweisung wird als "falsch" ausgewertet, wenn der Wert 0 ist, und andernfalls als "wahr"?

38voto

Amber Punkte 473552

Zeile 2 prüft, ob das aktuelle Zeichen der Null-Terminator der Zeichenfolge ist - da C-Zeichenfolgen null-terminiert sind und das Null-Zeichen als falscher Wert betrachtet wird, beginnt die Rekursion, wenn sie auf das Ende der Zeichenfolge trifft (anstatt zu versuchen, StrReverse4 für das Zeichen nach dem Null-Terminator aufzurufen, was außerhalb der Grenzen der gültigen Daten liegen würde).

Beachten Sie auch, dass der Zeiger auf eine char , so dass das Inkrementieren des Zeigers nur um 1 Byte erhöht wird (da char ist ein Ein-Byte-Typ).

Exemple :

 0  1  2  3
+--+--+--+--+
|f |o |o |\0|
+--+--+--+--+
  1. Wenn str = 0 entonces *str es 'f' daher erfolgt der rekursive Aufruf für str+1 = 1.
  2. Wenn str = 1 entonces *str es 'o' Der rekursive Aufruf erfolgt also für str+1 = 2.
  3. Wenn str = 2 entonces *str es 'o' Der rekursive Aufruf erfolgt also für str+1 = 3.
  4. Wenn str = 3 entonces *str es '\0' y \0 ist also ein falscher Wert if(*str) wird zu false ausgewertet, so dass kein rekursiver Aufruf erfolgt, so dass wir beim Zurückgehen in der Rekursion...
  5. Die letzte Rekursion wurde von `putchar('o') gefolgt, dann danach,
  6. Die nächstfolgende Rekursion war `putchar('o'), dann die darauf folgende,
  7. Auf die letzte Rekursion folgte `putchar('f'), und wir sind fertig.

3voto

DevSolar Punkte 63096

Der Typ eines C-Strings ist nichts anderes als ein Zeiger auf char. Die Konvention ist, dass der Zeiger auf ein Array von Zeichen zeigt, abgeschlossen durch ein Null-Byte .

*str ist also das erste Zeichen der Zeichenkette, auf die mit str .

Verwendung von *str in einer Bedingung wird ausgewertet zu false si str zeigt auf das abschließende Null-Byte in der (leeren) Zeichenkette.

2voto

1800 INFORMATION Punkte 125009

Am Ende einer Zeichenkette steht normalerweise ein 0-Byte - die Zeile if (*str) prüft, ob dieses Byte vorhanden ist, und hält an, wenn es gefunden wird.

1voto

Niko Punkte 5873

Am Ende der Zeichenkette befindet sich ein 0 - Sie haben also "test" => [0]'t' [1]'e' [2]'s' [3]'t' [4]0

et if(0) -> false

Auf diese Weise wird es funktionieren.

1voto

Akash Kava Punkte 37863

In Zeile 3 wird der Zeiger immer auf den nächsten Block hochgezählt (4 Bytes, da es sich um einen int handelt)...

Das ist falsch, das ist char *, es wird nur um 1 inkrementiert, weil char nur 1 Byte lang ist.

Aber wie wird dies als ein Argument für eine bedingte Anweisung (die außer einem booleschen Recht sollte?) verwendet werden?

Sie können einen beliebigen Wert in if( $$ ) bei $$ verwenden, und es wird nur geprüft, ob er ungleich Null ist oder nicht, im Grunde ist bool auch nur als einfache 1=wahr und 0=falsch implementiert.

In anderen höheren, stark typisierten Sprachen kann man solche Dinge nicht in if verwenden, aber in C läuft alles auf Zahlen hinaus. Und Sie können alles verwenden.

if(1) // evaluates to true 
if("string")  // evaluates to true
if(0) // evaulates to false

Sie können jede beliebige Sache in if,while-Bedingungen in C eingeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X