Verschleierte Art des Zugriffs auf ein Zeichen in einer Zeichenfolge

7

Ich habe heute ein interessantes Stück Code gefunden:

%Vor%

was wie folgt funktioniert:

%Vor%

Warum ist es überhaupt möglich? Vor allem warum wählt der Compiler das erste Zeichen aus der Zeichenfolge aus und verwendet es als Index, anstatt Fehler zu werfen?

    
erjot 23.09.2010, 16:43
quelle

2 Antworten

8

Ich erkläre es als Neuschreiben:

%Vor%

ist gleichbedeutend mit (nur alle double, float, int provisories mit dem Komma-Operator auswerten)

%Vor%

Jetzt sagt der Standard:

%Vor%

Egal welcher Zeiger ist. So bekommst du:

%Vor%     
ybungalobill 23.09.2010, 16:47
quelle
12

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:

%Vor%

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:

%Vor%

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:

%Vor%

was natürlich gleich '\t' ist. Jetzt ist das vollständige Stück Code:

%Vor%

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 ( ch ), das implizit zum Zeichenfolgenliteral hinzugefügt wird, mit dem es initialisiert wurde.

In beiden Fällen ist also der Endwert von 'j' %code% .

    
Tyler McHenry 23.09.2010 16:51
quelle

Tags und Links