1

私はオープンブックテストを受けましたが、適性検査のようなものなので、質問に答えるために必要なあらゆるリソースを使用できると言われました.1つの質問で本当に困惑しました.

質問は、与えられたものと同様の関数を書くことを求めています-私はできると確信しています-しかし、関数が何をしているのかについて多くの情報を見つけることができません.小さなサンプルを考えると、何が起こっているのかを判断するのは難しいです.

質問は次のとおりです。

プログラムは何を印刷しますか? 同等の getValue 関数を記述してください。

int t[]={1,2,3};
int getValue(int i)
{
  return "\5\3\8"[t[i]];    
}
void main()
{
  printf("%d",getValue(2));    
}

プログラムは「0」を出力しますが、これは簡単な部分です。そして、それを返す単純なメソッドで答えたくなる。しかし、getValue 関数で正確に何が起こっているのかをより深く理解したいと思っています。\8 は有効な 8 進数ではありませんが、結果の値に何らかの影響を与えるように見えるため、私の主な好奇心は、ラムダ式に関して文字列部分が何をするかです。

率直な答えを探しているのではなく (私が収集したものから、宿題タグを使用する理由です)、正しい方向へのプッシュだけです。

助けてくれてありがとう

4

3 に答える 3

2

エスケープ コードは 8 進数ではなく、10 進数だと思います。いずれにせよ、それらが 1 バイトしか占有しない限り、それらは無関係です。

これの実行を追跡するのは簡単です。まず、パラメータの置換を考えます

int t[]={1,2,3};
int getValue()
{
  return "\5\3\8"[t[2]];    
}
int main() //int, not void
{
  printf("%d",getValue());    
}

の 3 番目の値tは 3 で、文字列の4 番目の文字になります。文字列リテラルは 3 文字に NULL ターミネータを加えたものであるため、4 番目の文字は NULL ターミネータです。整数に変換すると、この値はゼロになります。呼び出しは、このprintf整数を正しく出力します。同様の関数は、たとえば、文字列に直接インデックスを付けるだけです。

于 2012-07-23T00:49:17.343 に答える
2

さて、実行をトレースします。まず、getValue が 2 で呼び出されます。内部では、最初に t[i] の値、つまり t[2]、つまり 3 を計算します。次に、文字列からインデックス 3 の文字を取得します。

この部分は少し説明する価値があります。文字列定数は、ASCII 5、ASCII 3、ASCII 8、および終端のヌル (ASCII 0) の 4 文字で構成されます。C では文字列のインデックスは 0 から始まるため、インデックス 3 の文字は null です。文字列から取得され、char から int に拡張され (関数が int を返すため)、返されます。そこに、すぐに印刷されます。

文字列での\__表記は「コード__の文字」を意味します。

于 2012-07-23T00:49:29.497 に答える
0

C FAQ 6.11 をチェックしてください。Steve Summit は、人々が FAQ 項目に直接 URL を投稿しないように要求しているので、http: //www.c-faq.com/ から始めて 6.11 に移動してください。

OPに対するMichael Burrのコメント応答にも注意してください。

于 2012-07-23T21:40:07.277 に答える