[解決済み] なぜ sizeof(my_arr)[0] はコンパイルして sizeof(my_arr[0]) と同じになるのでしょうか?
質問
なぜこのコードはコンパイルできるのでしょうか?
_Static uint32_t my_arr[2];
_Static_assert(sizeof(my_arr) == 8, "");
_Static_assert(sizeof(my_arr[0]) == 4, "");
_Static_assert(sizeof(my_arr)[0] == 4, "");
最初の2つのアサートは明らかに正しいのですが、私の理解では最後の行は失敗すると思っていました。
sizeof()
は整数リテラルとして評価され、配列として扱われないと理解しているからです。言い換えれば、それは次の行が失敗するのと同じ方法で失敗するでしょう。
_Static_assert(4[0] == 4, "");
興味深いことに、以下は確かにコンパイルに失敗しています(同じことをやっているはずですが?)
_Static_assert(*sizeof(my_arr) == 4, "");
error: unary '*' の型引数が不正('long unsigned int' がある)。 _Static_assert(*sizeof(my_arr) == 4, "")。
もしそれが重要なら、私はgcc 5.3.0を使用しています。
どのように解決するのですか?
sizeof
は関数ではありません。のような単項演算子です。
!
または
~
.
sizeof(my_arr)[0]
は次のように解析します。
sizeof (my_arr)[0]
となりますが、これは単に
sizeof my_arr[0]
に冗長な括弧をつけただけのものです。
これはちょうど
!(my_arr)[0]
は、次のようにパースします。
!(my_arr[0])
.
一般にC言語では、後置演算子は前置演算子よりも優先順位が高くなります。
sizeof *a[i]++
は次のようにパースします。
sizeof (*((a[i])++))
(後置演算子
[]
と
++
が適用されるのは
a
が適用され、次にプリフィックス演算子
*
と
sizeof
).
(の表現版です)。
sizeof
. 型バージョンもあり、これは括弧で囲まれた型名を取ります。
sizeof (TYPE)
. この場合、括弧は必須であり、また
sizeof
の構文の一部となります)。
関連
-
C 構造体定義エラー: '['トークンの前に一次式があることが予想される
-
#137: 式は変更可能なlvalueでなければならない問題 // 文字列配列の代入問題
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] 構造体のsizeofは、なぜ各メンバーのsizeofの合計と等しくないのですか?
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?
-
[解決済み] なぜ16進数には0xがつくのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] C言語の書式指定子 %ul と %lu の違いは何ですか?
-
[解決済み] C言語で%sを正しく使う - 超基本レベル
-
[解決済み] C 言語で const char* を char* に変換するには?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] 演算子 *, /, +, -, % を使わずに 3 で割る。
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?
-
[解決済み] ストラクチャーとユニオンの違い