0

それは非常に単純な質問だと思います...次のようなコードがあります:

//head is somewhere initialized with 0 (int head=0;)
char testclass::read() {
    return data[head];
    ++head;
}

実行しようとすると、ループが作成されます。次のように変更します。

char testclass::read() {
    ++head;
    return data[head];
}

ヘッドが高速にインクリメントされることを除いて、問題なく実行されます。だから問題は何ですか?

4

4 に答える 4

2

これを試して。

return data[head++];

++headリターン後の最初のソリューションでは、デッドコードです。実行されることはありません。コンパイル時に既に破棄されている可能性があります。2 番目のソリューションでは、headは戻ってくるまでに既にインクリメントされています。早すぎる。

後置インクリメント++演算子は、head++式の評価後、セミコロンの前で値をインクリメントすることがあります。ただし、正確な時間は未定義であり、コンパイラに依存します。したがってx++、同じステートメント内で複数の式を使用しないでください。

于 2013-09-15T16:39:51.363 に答える
2

できるよ:

return data[head++];

ポストインクリメント変数を返す動作が定義されているためです。の

int foo() { return x++; }

次と同等です。

int foo()
{
  int temp = x;
  ++x;
  return temp;
}

あなたの例では:

return data[head++];

次と同じです。

{
  int temp = head;
  ++head;
  return data[temp];
}
于 2013-09-15T16:50:13.897 に答える
1

あなたが望むのはこれだと思います:

char testclass::read() {
    char result = data[head];
    ++head;
    return result;
}

しかし、SzGが言ったように、これは次のように省略できますreturn data[head++];

于 2013-09-15T16:51:56.133 に答える
0

まず、知っておく必要があるのは、++i と i++ の違いは何ですか? .

あなたの場合、あなたはしたい:

  1. dataあなたのを読んでくださいhead
  2. あなたの移動head
  3. 1 で読み取った値を返します。

したがって、コードでは次のようになります。

char testclass::read() {
    char result = data[head];     // 1
    head += 1;                    // 2
    return result;                // 3
}

これで、ここの代わりに++headorを使用できます。このステートメントの結果は使用されないため、関数の動作は変更されません (つまり、使用できますが、おそらく使用したくないでしょう)。head++head += 1x = y += 1;

必要に応じて、この関数を 1 行で記述できますが、可読性が低下します (多くの場合、1 行に 1 つのステートメントのみを使用する方が適切です。この方法ではエラーが発生しにくくなります)。

return data[head++];

これhead++は、変数をインクリメントしますが、その「古い」値を返すため機能します。

ただし、3 行のコードよりも高速だとは思わないでください。コンパイラはそれを最適化するのに十分賢く、おそらく両方の実装で同じアセンブリ コードを生成します。


関数の最初のバージョンに関しては、return ステートメントの後のコードが実行されないことを忘れないでください。(たとえば、この SO を参照してください。return ステートメントが c++ でアクセスされた後の関数内のコードの実行)

于 2013-09-15T16:57:37.350 に答える