Kann die Ausgabe des Programms mit printf nicht verstehen

8

Ich habe mit einigen Interviewfragen gearbeitet, als ich diesen Code gefunden habe.

%Vor%

Es wird Folgendes gedruckt:

%Vor%

Ich kann nicht verstehen, wie die printf-Funktion hier funktioniert.

    
user3126632 26.09.2014, 16:03
quelle

4 Antworten

16

Sehen wir uns das erste Argument für den printf() -Aufruf an.

%Vor%

Dies verweist auf das gleiche wie ptr im folgenden Code.

%Vor%

Also, was bedeutet es, einen Zeiger zu erhöhen? Nun, wir bringen den Zeiger sizeof(*ptr) * 1 bytes vorwärts.

Also, im Gedächtnis haben wir:

%Vor%

Also ist Ihr Code mehr oder weniger funktional äquivalent zu:

%Vor%

Dies wertet das zusätzliche Funktionsargument aus und ignoriert es dann und druckt d .

Noch eine Sache: Sie sind sehr nahe daran, in diesem Code undefiniertes Verhalten zu verursachen. printf("%d", a) verwendet die falsche Formatzeichenfolge. Die korrekte Formatzeichenfolge für short int ist "%hd" .

Sie finden hier eine vollständige Tabelle mit Formatstrings .

    
Bill Lynch 26.09.2014, 16:19
quelle
7

"%d" + 1 macht Zeigerarithmetik, der Compiler sieht es als "d" , also

%Vor%

wird zu:

%Vor%

Sie können sehen, warum es d in Ihrem Compiler ausgibt.

Wie @sharth im Kommentar ausführt, wird das zusätzliche Argument a hier ausgewertet und verworfen.

    
Yu Hao 26.09.2014 16:16
quelle
2

Dies ist meine Antwort basierend auf @DCoders Kommentar. "%d" ist ein Zeiger auf das erste Zeichen des aus zwei Zeichen bestehenden Arrays %d . Wenn Sie dies um eins erhöhen, wird ein Zeiger auf d angezeigt. Die Tatsache, dass es ein zweites Argument gibt, spielt keine Rolle, da das Ergebnis "%d"+1 einfach das Zeichen d ist. Wenn Sie 0 hinzufügen, lautet Ihre Ausgabe 5 wie erwartet. Wenn Sie 2 hinzufügen, gibt es keine Ausgabe, da nur "" an printf übergeben wird.

    
Micah Smith 26.09.2014 16:10
quelle
1

In diesem Fall printf("%d"+1,a); = printf("d",a) .

Sie geben printf zum Drucken von +1 an, also "d" , so dass printf einfach d auf dem Bildschirm ausgibt.

    
user1336087 26.09.2014 16:13
quelle

Tags und Links