2016-04-23 11 views
0

Ich habe das so:Warum funktioniert dieser komische Code?

int main(){ 
    int Array[] = { 10, 20, 30 }; 
    cout << -2[Array] << endl; 
    system("Pause"); 
    return 0; 

} 

Die Ausgabe lautet:

-30

Ich möchte wissen, warum der Ausgang -30 und warum führt dies nicht definiertes Verhalten?

weiß jemand?

+1

Es funktioniert nicht. Es ruft undefiniertes Verhalten auf. – Gene

+0

danke für die Korrektur, ich werde die Frage bearbeiten! –

+4

Mögliches Duplikat von [Mit C-Arrays, warum ist es so, dass a \ [5 \] == 5 \ [a \]?] (Http://stackoverflow.com/questions/381542/with-c-arrays- warum-ist-es-der-fall-das-a5-5a) – milleniumbug

Antwort

1

Das ist ziemlich einfach.

Lassen Sie uns zunächst den Ausdruck analysieren:

-2[Array] 

ist

-(2[Array]) 

Jetzt a[b] ist *(a+b) und da zusätzlich kommutativ ist dies auch *(b+a) heißt Array[2].

Array[2] ist 30; -Array[2] ist -30. Somit ist -2[Array] auch -30.

Ich hoffe sehr, dass Sie nicht beabsichtigen, dies im Produktionscode zu verwenden.

+0

Danke! haha nein, ich werde nicht, es war nur ein Zweifel, den ich hatte. –

3

-2[Array] wird als -(2[Array]) geparst, da Subskribierung höhere Priorität als unäre Minus hat.

Jetzt 2[Array] is just a weird way to write Array[2], so erhalten Sie -Array[2], d.h. -30. In dem gesamten Ausdruck ist kein undefiniertes Verhalten enthalten.

0

In C++, die folgende Aussage gilt:

a[5] == 5[a] 

Dies ist, weil die Syntax [] verwendet wird umgewandelt:

*(a + 5) 

Z.B.

a[5] == *(a + 5) 

was bedeutet, dass

5[a] == *(5 + a) 

So ist die Notation -2[Array]-- *(2 + Array) umgewandelt wird.

0

Es wendet den unären Operator (-, Minuszeichen) auf einen um den Wert außerhalb von [] erhöhten Zeiger an: - *(2 + Array). Sie können es auschecken, indem Sie das Minuszeichen entfernen und somit + unären Operator anwenden. Ich würde nicht empfehlen, diese Syntax zu verwenden.