次のようなコードを含むコードを見つけました。
char c = "abc"[1];
gccでコンパイルして実行できます!この式の後c
になります。'b'
これはリテラル文字列をインデックス化するための標準ですか、それとも機能するのは単なる運ですか?
もちろん、文字列リテラルは配列型です。これは、式でへのポインターに変換され、へchar
の任意のポインターのようになりchar
ます。
char c = "abc"[1];
と
char *p = "abc";
char c = p[1];
同等です。
これは完全に標準です。文字列は、実際には文字の配列へのポインタへの構文糖衣の一部であり、どのポインタでも添え字表記を使用できます。
実際、a[b]
はと同等であり、これはと*(a + b)
同等*(b + a)
のわずかに驚くべき結果につながります。これが、一部のコード(特に、難読化されたコードの競合では、残念ながら排他的ではありません)でこの種のことを行う理由です。 :a[b]
b[a]
char c = 1["abc"];
起こるかもしれない。
"" で定義された文字列は、索引付けできる char* (char ポインター) に変換されるため、これは標準です。そのポインターのターゲットは常に 1 文字で、これはあなたの場合は b です。