Ich erkläre es als Neuschreiben:
%Vor% ist gleichbedeutend mit (nur alle double, float, int
provisories mit dem Komma-Operator auswerten)
Jetzt sagt der Standard:
%Vor%Egal welcher Zeiger ist. So bekommst du:
%Vor% Zuallererst ist all das double
und float
stuff reine Fehlleitung. Der Rückgabewert des Komma-Operators ist sein Argument auf der rechten Seite, also (double(), (float(), int()))
wird auf nur int()
reduziert, obwohl es einen double
und einen float
-Wert auf dem Weg erstellt und verwirft. So in Betracht ziehen:
Der erste Teil davon, der ausgewertet wird, ist
%Vor% Nun erkenne, dass int()
default - eine Ganzzahl konstruiert, die den Wert 0
ergibt. Die Aussage entspricht also:
Es ist ein ziemlich bekannter Trick in C und C ++, dass a[b]
und b[a]
gleichwertig sind, da der tiefgestellte Operator als a[b] === *(a + b)
definiert ist und die Addition kommutativ ist. Das ist wirklich dasselbe wie:
was natürlich gleich '\t'
ist. Jetzt ist das vollständige Stück Code:
was aus dem gleichen Grund äquivalent ist zu:
%Vor%Was natürlich auch als
geschrieben werden könnte %Vor% Wenn Sie der Zeichenfolge "abcdefghij" einen Namen gegeben haben und die Verwendung des C ++ 0x auto
Schlüsselworts bei der Deklaration von ch
vergessen haben.
Beachten Sie schließlich, dass \t
gleich 9 ist, da das Tabulatorzeichen den ASCII-Wert 9 hat. Daher ist str['\t']
mit str[9]
identisch. str
besteht aus 10 Zeichen, gefolgt von einem NUL-Zeichenabschlusszeichen (
), das implizit zum Zeichenfolgenliteral hinzugefügt wird, mit dem es initialisiert wurde. ch
In beiden Fällen ist also der Endwert von 'j'
%code% .
Tags und Links c++ obfuscation