5

インタビューの 1 つで、次の行は C で何を出力するのかと尋ねられました。私の意見では、次の行は意味がありません。

"a"[3<<1];

誰も答えを知っていますか?

4

5 に答える 5

13

驚くべきことに、これには意味があります。文字列リテラルを表す文字配列へのインデックス付けです。ちなみに、この特定のインデックスは で6あり、これはリテラルの制限外であるため、未定義の動作です。

同じ基本パターンに従って機能する式を作成できます。

char c = "quick brown fox"[3 << 1];

と同じ効果があります

char c = 'b';
于 2012-07-10T22:14:26.867 に答える
3

これについて考えてください:

"Hello world"[0] 

'H'

"Hello world"文字列リテラルです。文字列リテラルは の配列でcharあり、式の配列の最初の要素へのポインターに変換されます。"Hello world"[0]配列の最初の要素を意味します。

于 2012-07-10T22:14:34.090 に答える
3

それには意味があります。ヒント:a[b]とまったく同じ意味*(a+b)です。(ただし、これは素晴らしいインタビューの質問だとは思いません。)

于 2012-07-10T22:15:02.347 に答える
2

"a"'a'は、、、およびの2文字の配列です03 << 1である3*2 = 6ため、2要素配列の7番目の要素にアクセスしようとしています。それは未定義の動作です。

(また、印刷関数が呼び出されないため、未定義の動作が削除されても、コードは何も印刷しません。)

于 2012-07-10T22:16:47.780 に答える
1

"some_string" [i]は、指定された文字列のi番目の文字を返します。3<<1は6です。したがって"a"[3<<1]、文字列「a」の6番目の文字を返そうとします。

言い換えると、コードは範囲外のchar配列にアクセスしているため、未定義の動作を呼び出します(したがって、ある意味では実際には意味がありません)。

于 2012-07-10T22:16:51.693 に答える