7

こんにちは、「C++ でスキルをテストする」で質問に出くわしました。

例文で意味を教えてください。

編集されたセクション: 余分な括弧があり、編集および削除されて申し訳ありません。

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

4 に答える 4

25

スパイラル ルール (chris によってリンクされている) に従い、識別子から始めます。

a

...は...

a[4]

...4 の配列...

*a[4]

...ポインタ...

(*a[4])()

...パラメータを取らない関数...

*(*a[4])()

...へのポインタを返します...

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

...5 つの配列...

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

...文字。

補足: これを思いついたアーキテクトに良いドレスダウンを与えてから、コメントなしでこのコードを書いたプログラマーを見つけて、に良いドレスダウンを与えてください。これが宿題として与えられた場合は、時間を無駄にするのではなく、代わりに cdecl を使用する方法、または狂人の走り書きのように見えないようにコードを設計する方法を教えてもらうべきだったと先生に伝えてください。これとともに。

于 2012-06-24T07:31:15.543 に答える
16

私は余分な右括弧であると思うものを削除し、結果をcdeclに貼り付けることによってだましました。

declare a as array 4 of pointer to function returning pointer to array 5 of char

于 2012-06-24T07:15:28.790 に答える
13

そして別の例... 例以外では絶対にやってはいけないこと。

#include <iostream>

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;
}
于 2012-06-24T08:39:05.950 に答える
8

そして、ここに例があります...

#include <stdio.h>

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;
}
于 2012-06-24T08:23:02.293 に答える