今日、私はEric Lippertによる、演算子の優先順位と評価の順序の間の神話を明らかにしようとしている記事に出くわしました。最後に、私を混乱させた2つのコードスニペットがありました。最初のスニペットは次のとおりです。
int[] arr = {0};
int value = arr[arr[0]++];
ここで、変数値の値について考えるとき、単純に1と計算します。これが私がそれが機能していると思った方法です。
- まず、arrを1つの項目を含むintの配列として宣言します。このアイテムの値は0です。
- 次に、この場合はarr[0]-0の値を取得します。
- 3番目にarr[ステップ2の値]の値を取得します(これはまだ0です)-arr[0]を再度取得します--まだ0です。
- 4番目に、ステップ3(0)の値を変数値に割り当てます。--value=0になりました
- ステップ2の値に追加します1---ここでarr[0]=1です。
どうやらこれは間違っています。インクリメントが実際にいつ発生するかについての明示的なステートメントをC#仕様で検索しようとしましたが、見つかりませんでした。
2番目のスニペットは、このトピックに関するEricのブログ投稿のコメントからのものです。
int[] data = { 11, 22, 33 };
int i = 1;
data[i++] = data[i] + 5;
配列を宣言し、iに1を割り当てた後、このプログラムがどのように実行されるかを次に示します。[私と一緒にplzクマ]
- データを取得[i]-1
- ステップ1の値に値5--6を追加します
- data [i](まだ1)にステップ2の値を割り当てます--data [i] = 6
- インクリメントi--i=2
私の理解によると、この配列には値{11、27、33}が含まれているはずです。ただし、ループして配列値を出力すると、{11、38、33}が得られました。これは、配列を逆参照する前にポストインクリメントが発生したことを意味します。
どうして?この投稿の増分は投稿であると想定されていませんか?つまり、他のすべての後に起こります。
私は何が欠けているのですか?