[解決済み] C言語はそんなに難しくない:void ( *( *f[] ) () ) ()
質問
今日、ある写真を見たので、解説をお願いします。そこで、その写真を紹介します。
このようなコードが実用化されることはあるのだろうかと、戸惑いを覚えました。ググってみたら、別の写真が これ redditのエントリーで、その写真がこちらです。
では、この "reading spirally" は何か有効なものなのでしょうか?Cコンパイラはこのように解析するのでしょうか?
この変なコードについて、もっと簡単な説明があれば最高なのですが。
それとは別に、このようなコードは役に立つのでしょうか?もしそうなら、どこで、いつ?
があります。 質問 についてですが、単にその適用方法や、そのルールで表現した場合の読み方について聞いているわけではありません。そのような式の使い方やスパイラルルールの有効性についても質問しています。これについては、すでに素敵な回答が掲載されています。
どのように解決するのですか?
というルールがあります。 時計回り・螺旋の法則" を使えば、複雑な宣言の意味を見つけることができます。
から c-faq :
簡単な3つのステップがあります。
未知の要素から、らせん状に時計回りに進み、次の要素に出会ったら、対応する英文に置き換えてください。
[X]
または[]
=> 配列Xのサイズ... または 配列のサイズ未定...
(type1, type2)
=> type1とtype2を渡して返す関数...
*
=> ポインタは...すべてのトークンがカバーされるまで、これを螺旋状/時計回りに続ける。
括弧の中にあるものは必ず最初に解決してください
上記のリンク先で例を確認することができます。
また、あなたを助けるためにというウェブサイトがあることに注意してください。
C言語の宣言を入力すると、その英語の意味が表示されます。例えば
void (*(*f[])())()
が出力されます。
f を void を返す関数へのポインタの配列として宣言します。
EDITです。
のコメントでご指摘の通りです。
ランダム832
スパイラルルールは配列の配列を扱わないので、(ほとんどの)配列の宣言で間違った結果を導くことになります。例えば
int **x[1][2];
は、スパイラルルールでは
[]
よりも優先順位が高い
*
.
配列の配列の前では,螺旋の法則を適用する前に,まず明示的に括弧を付けることができる.例えば
int **x[1][2];
と同じです。
int **(x[1][2]);
(C言語でも有効)優先順位とスパイラルルールにより、 "x is an array 1 of array 2 of pointer to pointer to int" と正しく読み取りますが、これは正しい英語の宣言です。
なお、この問題については、以下の記事でも取り上げています。 回答 によって ジェームス・カンゼ (ご指摘の ハックス をコメントで紹介しました)。
関連
-
C 言語のポインタ配列のポインタ型、ポインタに値を割り当てるために配列名を使用、コンパイル時の警告:互換性のないポインタ型からの初期化
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] 構造体のsizeofは、なぜ各メンバーのsizeofの合計と等しくないのですか?
-
[解決済み] C言語とC++の両方で有効なコードを、それぞれの言語でコンパイルすると、異なる動作になることがありますか?
-
[解決済み] C言語のi++と++iに性能差はあるのでしょうか?
-
[解決済み] C言語で "unsigned long "をprintfする方法は?
-
[解決済み] Objective-C:idとvoidの違い*。
-
[解決済み] ポインタの表現。*ptr++、*++ptr、++*ptr。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
C - 添え字の値が配列でもポインタでもベクトルでもないエラー
-
[解決済み] MIPSのネストされたForループと配列の使用
-
[解決済み] Xcode - 警告。C99 では関数の暗黙の宣言は無効です。
-
[解決済み] C - Setデータ構造を実装するには?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?
-
[解決済み] ストラクチャーとユニオンの違い
-
[解決済み] 講師が書いたC言語のファイルは、なぜ最初の行に#が一つ付いているのですか?
-
[解決済み】定数ポインタと定数へのポインタの比較【重複