-3

コードによれば、後でインクリメントする必要がある場合でも、pの値が2回インクリメントされていると表示されるのはなぜですか

#include "iostream.h"
#include "conio.h"

using namespace std;

int main()
{
  int i;
  cin>>i;
  int *p;         // p is a pointer to int
  int *&r = p;   // r is a reference to the pointer p

  r = &i;        // r refers to a pointer; assigning &i to r makes p point to i
  cout<<*p<<*r<<(*p)++<<*p<<*r<<(*r)++<<endl;

  getch();
  return 0;
}
4

1 に答える 1

1

あなたが疑問に思っている奇妙な動作は、リダイレクトされた引数が解析され実行される順序によるものだと思います。

#include <iostream>

using namespace std;

int main()
{
  int i = 1;
  cout << i << i << i++ << i << i << i++ << endl;
  return 0;
}

この特定のケースでは、私が使用している特定のコンパイラで... (つまり、これはすべて未定義または未指定の動作です。結果を解釈しようとしているだけです。未定義の動作をトリガーするコードを書くことは常に避ける必要があります)。

引数 3 と 6 が最初に評価されます (++演算子がアタッチされているためですか? Rodrigo に感謝します)。

したがって、右端i++は に評価され、 の1ままiになり2ます。

次に 3 番目の引数i++が評価され、 が与えられ2、そのままiになり3ます。

他のすべての引数は に評価され3ます。それが出力を取得する方法です

332331.

リダイレクトされた要素の評価の順序は指定されていないことに注意してください。つまり、コンパイラからコンパイラなどに変更される可能性があり、それがどうなるかはわかりません。

std::cout を使用した引数の評価順序も参照してください 。

@rodrigo が私に指摘したようiに、同じ式で 2 回インクリメントされるため、結果は未定義です。

したがって、多くのグレムリンが関与しています。これは、出力がどのように生成されるかについて、正しい可能性も間違っている可能性もある解釈の 1 つです。

于 2013-06-16T10:56:42.020 に答える