Warum ergibt das "c"?



  • wenn ich folgendes Statement ausführe, ergibt das "d". Kann mir wer (im detail) erklären warum?

    cout << 3["abcd"];
    

    EDIT: Ja, muss natürlich "d" rauskommen, nicht "c". Hab's geändert.



  • Verbuggter Compiler? Eigentlich sollte 'd' rauskommen.



  • "abcd" liegt als const char* im Speicher. Also einem Zeiger auf ein einzelnes Zeichen. Mit dem [] -Operator gehst du dann die angegebene Anzahl an Zeichen weiter im Speicher

    "abcd"[0] gibt dir also das erste Zeichen aus (von der Adresse, wo das "a" liegt 0 Zeichen nach vorne)

    "abcd"[2] also das c (zwei Zeichen nach dem a)

    im Grunde also nur eine Addition: Speicheradresse + Index.

    Und aus dem Mathematikunterricht weiß man ja, dass a + b und b + a identisch sind.

    Also geht auch index + Speicheradresse, oder eben 2["abcd"]



  • Ok, also der [] Operator ist kommutativ? Array[index] ist also absolut identisch zu index[Array], richtig?



  • marktwain schrieb:

    Ok, also der [] Operator ist kommutativ? Array[index] ist also absolut identisch zu index[Array], richtig?

    Laut Standard (Kurzfassung): x[y], wobei eins davon ein Zeigertyp und eins ein Integertyp ist, ergibt *(x+y).



  • Ok, perfekt. Danke.



  • zwutz schrieb:

    "abcd" liegt als const char* im Speicher.

    "abcd" ist ein Lvalue-Ausdruck vom Typ const char[5] .



  • Vorsicht: Die Äquivalenz a[b] == *(a+b) gilt im Normalfall nicht für überladene Operatoren (z.B. im Zusammenhang mit dem Array-Wrapper std::tr1::array ).


Log in to reply