4

重複の可能性:
cout << c++ << c; の正解は?

ふと気がついたらテキストを出力していました。

#include <iostream>
int main()
{    
 int array[] = {1,2,3,4};                 
 int *p = array;

    std::cout << *p << "___" << *(p++) << "\n";
    // output is  1__1. Strange, but I used  brackets! it should be at
    // first incremented, not clear.
    p = array;


   std::cout << *p << "___" << *(++p) << "\n";
   // output is 2_2   fine, why first number was affected? I didn't intend 
   // to increment it, but it was incremented
   p=array;


   std::cout << *p << "___" << *(p + 1) << "\n";
   // output is 1_2 - as it was expected
   p = array;

 return 0;
}

そのような振る舞いは私にとって奇妙です、なぜそうなのですか?

4

1 に答える 1

15

あなたは未定義の動作を引き起こしているので、何かが起こる可能性があり、その理由について推測しても意味がありません.

表現

std::cout<<*p<<"___"<<*(p++)<<"\n"

一例です: 間のすべてのものの評価の順序<<は指定されていないため*p、 と*(p++)は互いに順序付けされていません (つまり、コンパイラはどちらかを最初に実行する必要はありません)。変数を変更してから、変更と使用を順序付けずに使用することは許可されていないため、未定義の動作が発生します。

同じことは、変数が変更され、同じ式で個別にシーケンスなしで使用される、そのプログラム内の他のすべての場所に適用されます。

于 2012-09-29T14:12:47.813 に答える