インタビューの 1 つで、次の行は C で何を出力するのかと尋ねられました。私の意見では、次の行は意味がありません。
"a"[3<<1];
誰も答えを知っていますか?
驚くべきことに、これには意味があります。文字列リテラルを表す文字配列へのインデックス付けです。ちなみに、この特定のインデックスは で6
あり、これはリテラルの制限外であるため、未定義の動作です。
同じ基本パターンに従って機能する式を作成できます。
char c = "quick brown fox"[3 << 1];
と同じ効果があります
char c = 'b';
これについて考えてください:
"Hello world"[0]
は'H'
"Hello world"
文字列リテラルです。文字列リテラルは の配列でchar
あり、式の配列の最初の要素へのポインターに変換されます。"Hello world"[0]
配列の最初の要素を意味します。
それには意味があります。ヒント:a[b]
とまったく同じ意味*(a+b)
です。(ただし、これは素晴らしいインタビューの質問だとは思いません。)
"a"
'a'
は、、、およびの2文字の配列です0
。 3 << 1
である3*2 = 6
ため、2要素配列の7番目の要素にアクセスしようとしています。それは未定義の動作です。
(また、印刷関数が呼び出されないため、未定義の動作が削除されても、コードは何も印刷しません。)
"some_string" [i]は、指定された文字列のi番目の文字を返します。3<<1
は6です。したがって"a"[3<<1]
、文字列「a」の6番目の文字を返そうとします。
言い換えると、コードは範囲外のchar配列にアクセスしているため、未定義の動作を呼び出します(したがって、ある意味では実際には意味がありません)。