3

重複の可能性:
C配列では、なぜこれが当てはまるのですか?a [5] ==5[a]
多次元配列のCの奇妙な配列構文

今日、私はこのブログに出くわしました。私を最も惹きつけたのはこれです:

int i;
i["]<i;++i){--i;}"];

配列の添え字内の奇妙な「文字列定数」の目的はよくわかりませんが、整数変数を添え字にする方法がわかりません。だから私はこのコードを持ってきました:

#include <stdio.h>

int main(void) {
    int x = 10;

    printf("%d", x["\0"]); /* What is x["\0"]?! */

    return 0;

}

MinGWと-Wall-ansi-pedanticを使用してエラーなしでコンパイルします。次に、このコードは105を出力します。

誰かがこれを解釈できますか?

編集:添え字内にポインターが必要であることがわかりました。そうでない場合、コンパイル時エラーが発生します。

4

3 に答える 3

5

これは、配列のインデックス作成がどのように機能するかの結果です。

与えられた配列:

int array[5];

それから

array[3]

本当に別の構文です

*(array + 3)

したがって、それはと同じです

*(3 + array)

つまり、あなたもできるということです

3[array]
于 2012-07-05T13:50:56.513 に答える
5

C11標準はこれを言います:

6.5.2.1、配列の添え字

[...]

接尾辞式の後に角括弧内の式が続く[]場合は、配列オブジェクトの要素を添え字で示します。添え字演算子の定義は、[]E1[E2]同じです(*((E1)+(E2)))。二項+演算子に適用される変換規則により、E1が配列オブジェクト(同等に、配列オブジェクトの初期要素へのポインター)でE2あり、が整数である場合、は(ゼロから数えて)の 要素をE1[E2]指定します。E2-thE1

ノート:

E1[E2]と同じです(*((E1)+(E2)))

したがって

 E1[E2] = E2[E1]

。さらに、

6.4.5文字列リテラル

[...]

次に、マルチバイト文字シーケンスを使用して、シーケンスを含めるのに十分な静的ストレージ期間と長さの配列を初期化します。文字列リテラルの場合、配列要素のタイプはchar

したがって、次のことを行うのが有効です。

"foobar"[x];
x["foobar"];
于 2012-07-05T13:53:31.243 に答える
4

これはよく知られているトリックです。ポインタ演算の仕組みにより、以下は同義語です。

  • v[5]
  • 5[v]
  • *(v + 5)

vたまたま文字列リテラルの場合も同じです。

于 2012-07-05T13:49:07.693 に答える