2011-03-04 9 views
4

最後の数日間C#で遊んでいて、その「簡潔な」構文を利用しようとしたが、私は次のトリックを試してみた。C#の単一行のインクリメントとリターンステートメント

Int32 _LastIndex = -1; 
T[] _Array; 
_Array[_LastIndex++] = obj; 

今、これに伴う問題は、それが前に番号をインクリメントした値を返すということですので、私は...

_Array[(_LastIndex++)] = obj; 

を試してみましたが、まだ同じ動作が(発生しているにも私を得ました少し混乱している)。

誰かがまず2番目の例(最初の理由がわかる理由)がうまくいかない理由を最初に説明できますか?そして私がやろうとしていることを達成するための方法がありますか?あなたが欲しい

答えて

5

個別の操作にそれを分離しない括弧付きポストインクリメントを_LastIndex++囲む、それだけで変更されます。

_Array[_LastIndex++] = obj; // _Array[_LastIndex] = obj; _LastIndex++; 

へ:

_Array[(_LastIndex++)] = obj; // _Array[(_LastIndex)] = obj; _LastIndex++; 

あなたが使用する前にインクリメントしたい場合は、次のようにあなたは、事前インクリメントバリアントが必要になります。

_Array[++_LastIndex] = obj; // ++_LastIndex; _Array[_LastIndex] = obj; 
2

_Array[++_LastIndex] = obj; 

これは、値が使用される前に、インクリメントが行わ意味し、事前インクリメントと呼ばれています。括弧は優先順位を変更するために使用され、必ずしも評価の順序を変更する必要はありません。さらに、カッコはこの場合の優先順位に影響を与えませんでした。

4

_Array[++_LastIndex]を試しましたか?

LastIndex++は、値をインクリメントしますが、古い値を返します。

++LastIndexインクリメントし、インクリメントされた値を返します。

関連する問題