2017-12-16 4 views
-7
int x = ~!printf; 
printf("%d\t%x",x,x); 

Es gibt: -1 ffffWas bedeutet dieser Code in C, "int x = ~! Printf"?

Kann mir jemand erklären?

+1

Konvertiere den Funktionszeiger in den Booleschen Modus, negiere ihn logisch, dann arithmisch, um alle gesetzten Bits zu erhalten, drucke. –

+7

Nicht im Widerspruch zu Jean, ich denke, die tiefere Bedeutung dieses Codes ist, dass der Autor versuchte, absichtlich zu verwirren, möglicherweise den Leser zu nerven. Wird das Ergebnis irgendwo anders verwendet? Wenn ja, würde mich das wirklich interessieren. Sie könnten das beantworten, indem Sie den Verwendungscode anzeigen. Eine ehrenhaftere Absicht wäre es, dich zu testen. Sie würden dies nicht für Hausaufgaben oder für eine Prüfung tun, die Sie nehmen? – Yunnosch

+0

Für Booleans, 0 = falsch, alles andere ist wahr. printf ist ein Funktionszeiger und seine Adresse ist sicherlich nicht 0, so wie es boolean wäre, wäre es wahr. Dieser boolesche Wert wird zu false (= 0) invertiert, folgt dann einer bitweisen Inversion (alle 0 Bits werden auf 1 gesetzt) ​​und als vorzeichenbehaftete Ganzzahl gespeichert. Eine vorzeichenbehaftete ganze Zahl mit allen gesetzten Bits ist -1. printf gibt diesen Wert für% d als Dezimalzahl für% x im Hexadezimalformat aus. – Youka

Antwort

5

printf ohne Argumente sind die Funktionszeiger verdient einen Wert ungleich Null (es ist eingebaut in so der Zeiger nicht Null sein kann)

Nun wenden Sie logische Negation (!) zu diesem nicht Nullwert: Sie erhalten Null.

Nun ist diese Null-Bit-weise negieren (Bit zu Bit Negation ~ verwenden), erhalten Sie alle 1s im int Bit-Bereich

Printing es in dezimal Ausbeuten -1 (die auf dem Compiler variieren kann), und in hexadezimal ergibt sich eine bestimmte Anzahl von f s, von der Größe der ganzen Zahl abhängig (auf meinem 32-Bit-integer-Compiler, ich ffffffff)

(beachten Sie, dass -Specieinlley die Negation der Funktion Zeiger- nicht Teil irgendeines gültig sein kann Programm, dies ist nur für akademische Zwecke)

+1

Die Negation des Funktionszeigers könnte ein Test sein, um festzustellen, ob der Zeiger überhaupt gesetzt ist. Natürlich ist 'printf' hier kein Nullwertfunktionszeiger. –