Warum geht das und was macht es?



  • Warum kann der folgende Code compiliert und exekutiert werden?

    int main(int argc, char** argv) 
    {
        int wert=12;
        int x;
        printf("hallo\n");
        x=wert["0"];     // kein Fehler !!!
    //  x=wert[0];       // Fehler, ist ja logisch
        printf("%d\n",x);
        return (EXIT_SUCCESS);
    }
    

    Bite um Antwort
    Walter



  • Also ich kann das nich kompilieren, aber um deine frage zu beantworten:

    Sei

    ptr
    

    ein Zeiger irgendeines Typs und zeige auf ausreichend allokierten Speicher. Die schreibweise

    ptr[index]
    

    ist das selbe wie

    *(ptr + index)
    

    (Zeigerarithmetik) und konsequenterweise (da Addition kommutativ) das selbe wie

    *(index + ptr)
    

    und folgerichtig das selbe wie

    index[ptr]
    

    Wenn man jetze noch hinzunimmt das so ein Stringliteral auch als Zeiger auf das selbe zu verwenden ist, sollte der Code klar sein.



  • wert["0"] entspricht (wert + "0") oder ("0" + wert). "0" ist ein Zeiger. Der gcc in Version 4.6.1 kompiliert es.



  • ich kanns auch nicht compilieren.
    meyer.c: In function 'main':
    meyer.c:5: warning: incompatible implicit declaration of built-in function 'printf'
    meyer.c:9: error: 'EXIT_SUCCESS' undeclared (first use in this function)
    meyer.c:9: error: (Each undeclared identifier is reported only once
    meyer.c:9: error: for each function it appears in.)



  • pferdefreund schrieb:

    ich kanns auch nicht compilieren.
    meyer.c: In function 'main':
    meyer.c:5: warning: incompatible implicit declaration of built-in function 'printf'
    meyer.c:9: error: 'EXIT_SUCCESS' undeclared (first use in this function)
    meyer.c:9: error: (Each undeclared identifier is reported only once
    meyer.c:9: error: for each function it appears in.)

    int main()
    {
        int wert = 12;
        int x;
        printf("hallo\n");
        x=wert["0"];     // kein Fehler !!!
    //  x=wert[0];       // Fehler, ist ja logisch
        printf("%d\n", x);
        return 0;
    }
    

    So kannst du's kompilieren. 😉



  • @ScottZhang:
    Danke für die verstänliche Erklärung.
    Du solltest Lehrer werden. 🙂

    lg
    Walter



  • Hihi, das wusste ich auch noch nicht:

    char a[] = ".2.";
    int b[] = { 1, 42, 1 };
    int i = b[0][a]; // == a[b[0]]
    

    Der Subscript-Operator benötigt einen Pointer und ein Integer, egal was vor und was in den Klammern steht.

    In dem Fall oben ist b[0] ein int und dieser wird als index für das Array a verwendet. i bekommt also den Wert '2' oder 50 (Ansi).

    Nicht gerade das, was man intuitiv erwarten würde.

    Fallen euch noch andere Konstruktionen ein, die kurios sind?



  • ghs999 schrieb:

    Warum kann der folgende Code compiliert und exekutiert werden?

    Exekutiert wird höchstens der, der solchen Code ernsthaft verwendet. Code wird ausgeführt. 🙂


Anmelden zum Antworten