2016-12-30 16 views
2
#include <iostream> 

using namespace std; 

int main(void) { 
    cout << 2["abc"] << endl; 
    return 0; 
} 

$ g++ test.cpp -o test 
$ ./test 
c 

Was ist die C++ Syntax? Warum es funktioniert? Kann es jemand erklären?cout << 2 ["abc"] << endl; Warum funktioniert es? Welche Syntax ist das?

+2

Nur weil es funktioniert, bedeutet nicht, dass Sie es verwenden sollten. – DeiDei

+1

Nur weil Sie es nicht benutzen sollten, heißt das nicht, dass Sie nicht fragen sollten, warum es funktioniert. – rightfold

+1

nur weil ich frage, warum es funktioniert, habe ich es herausgefunden Vielen Dank an alle !! – neo1218

Antwort

7

Da a[b] ist *(a + b) und b[a] ist *(b + a) und + kommutativ.

wenn nicht überladen und andere Spielereien.

3

Die Array-Indizierung ist kumulativ. Siehe this und this.

In Ihrem Fall schmaler Stringliterale ist im Grunde const Array von Zeichen. Das macht:

cout << 2["abc"] << endl; 

gleiche wie

cout << "abc"[2] << endl; 

Zur teilweisen Zitat (Hervorhebung von mir):

[lex.string/8]

... Ein schmaler Stringliteral hat Typ „Array von n const char“ ...

[expr.sub/1]

A Postfix Ausdruck durch einen Ausdruck in eckigen Klammern ist eine Postfix-Expression. einer der Ausdrücke soll ein glvalue vom Typ „array of T“ oder ein prvalue des Typs „Zeiger auf T“ sein, und die andere wird eine prvalue von unscoped Enumeration oder integralen Typ sein. Das Ergebnis ist vom Typ „T“ ....


Hinweis: es funktioniert nur für Arrays. Wenn Sie das tun:

struct Foo 
{ 
    Foo& operator[](std::size_t index) { return *this; } 
}; 

Foo foo; 

Im Folgenden wird die Arbeit arbeiten, weil seine tatsächlich foo.operator[] (2) Aufruf;

Foo f; 
f[2]; //Calls foo.operator[] (2); 

wird im Folgenden nicht arbeiten, weil einer der Ausdrücke ist nicht ein Array, damit der Compiler geht eine geeignete 2.operator[] (foo) zu finden, die wegen integrale Typen versagen keine Mitgliederfunktionen haben.

2[f]; //will not work 
Verwandte Themen