wat betekent dit char (* (* a [4]) ()) [5]?

Hallo, ik kwam de vraag tegen in "Test je vaardigheden in C ++".

Laat me alsjeblieft weten wat het betekent met een voorbeeld?

Edited Section: Sorry for the extra parenthesis, edited & removed.

char (*(*a[4])())[5]
7
IT betekent dat de persoon die het schreef boos is op iemand en niet wil dat je de code kunt lezen.
toegevoegd de auteur Martin York, de bron
Spiraalregel wint opnieuw.
toegevoegd de auteur chris, de bron
Welke website vertaalde wartaal C-verklaringen naar een voor mensen leesbare vorm?
toegevoegd de auteur K-ballo, de bron
Het is een syntaxisfout als gevolg van onevenwichtige haakjes.
toegevoegd de auteur Blastfurnace, de bron
Ervan uitgaande dat je bedoelt char (* (* a [4]) ()) [5]; cdecl.org zegt "declare a array 4 of pointer to function retournerende pointer naar array 5 of char"
toegevoegd de auteur Retired Ninja, de bron
@RetiredNinja: bedankt voor je waardevolle antwoord.
toegevoegd de auteur Abhineet, de bron
is dat een slechte coder of goede code?
toegevoegd de auteur CB4, de bron

4 antwoord

De spiraalregel volgen (zoals gekoppeld aan chris) en beginnen met de identifier:

a

... is ...

a[4]

... een reeks van 4 ...

*a[4]

... wijst naar ...

(*a[4])()

... een functie zonder parameters ...

*(*a[4])()

... terugkerende aanwijzer naar ...

(*(*a[4])())[5]

... een serie van vijf ...

char (*(*a[4])())[5]

... tekens.

Sidenote: Geef de architect die dit bedacht een goede uitwerking, zoek de programmeur die deze code heeft geschreven zonder een opmerking uit te leggen en geef hem een goede aanpak. Als u dit als huiswerk hebt gekregen, vertel uw docent dan dat hij u had moeten instrueren hoe u cdecl in plaats daarvan moet gebruiken, of hoe code zodanig moet worden ontworpen dat het niet als gekke scrawls lijkt, in plaats van uw tijd te verspillen. hiermee.

25
toegevoegd

Ik heb vals gespeeld door wat ik denk een extra haakje tussen haakjes te verwijderen en het resultaat in cdecl te plakken.

declareren als matrix 4 van pointer naar functie die de aanwijzer retourneert naar array 5 van char

16
toegevoegd
@Abhineet, ik weet wat arrays, functie-aanwijzers, functie-retourwaarden en verwijzingen naar karakterarrays zijn, maar ik kan geen praktisch voorbeeld bedenken dat deze specifieke combinatie van taalkenmerken gebruikt.
toegevoegd de auteur Blastfurnace, de bron
Kun je me alsjeblieft een voorbeeld geven. Bedankt voor je waardevolle antwoord.
toegevoegd de auteur Abhineet, de bron

En nog een voorbeeld ... van wat je nooit zult doen in iets anders dan een voorbeeld.

#include 

typedef char stuff[5];
stuff stuffarray[4] = { "This", "Is", "Bad", "Code" };

stuff* funcThis()   { return &(stuffarray[0]); }
stuff* funcIs()     { return &(stuffarray[1]); }
stuff* funcBad()    { return &(stuffarray[2]); }
stuff* funcCode()   { return &(stuffarray[3]); }

int main()
{
    char (*(*a[4])())[5] = { funcThis, funcIs, funcBad, funcCode };
    for(int i = 0; i < 4; ++i)
    {
        std::cout << *a[i]() << std::endl;
    }
    return 0;
}
13
toegevoegd
+1 voor de typedef : maakt je slechte code beter dan mijn slechte code! :)
toegevoegd de auteur acraig5075, de bron
Ik heb volledig C ++ ified het met cout ook! :) Het typedef is omdat ik niet kon achterhalen hoe de functies zonder te declareren.
toegevoegd de auteur Retired Ninja, de bron
@RetiredNinja: bedankt voor je waardevolle antwoord.
toegevoegd de auteur Abhineet, de bron

En hier is een voorbeeld ...

#include 

char a[5] = "abcd"; 
char b[5] = "bcde"; 
char c[5] = "cdef"; 
char d[5] = "defg"; 

char (*f1())[5] { return &a; }
char (*f2())[5] { return &b; }
char (*f3())[5] { return &c; }
char (*f4())[5] { return &d; }

int main()
{
        char (*(*a[4])())[5] = { &f1, &f2, &f3, &f4 };
        for (int i = 0; i < 4; i++)
                printf("%s\n", *a[i]());
        return 0;
}
8
toegevoegd
Bedankt voor je waardevolle antwoord.
toegevoegd de auteur Abhineet, de bron