簡體   English   中英

C#中的前后增量

[英]Pre- & Post Increment in C#

我對C#編譯器如何處理前后增量和減量有點困惑。

當我編寫以下代碼時:

int x = 4;
x = x++ + ++x;

x將具有值10。 我認為這是因為預增量將x設置為5 ,這使得它為5+5 ,其值為10 然后后增量將x更新為6 ,但不會使用該值,因為10將分配給x

但是當我編碼:

int x = 4;
x = x-- - --x;

之后x將是2 任何人都可以解釋為什么會這樣嗎?

x--將是4,但是在--x時刻將是3,所以它將結束為2,然后你將擁有

x = 4 - 2

順便說一下,你的第一個案例是x = 4 + 6

這是一個小例子,將打印出每個部分的值,也許這樣你就會更好地理解它:

static void Main(string[] args)
{
    int x = 4;
    Console.WriteLine("x++: {0}", x++); //after this statement x = 5
    Console.WriteLine("++x: {0}", ++x); 

    int y = 4;
    Console.WriteLine("y--: {0}", y--); //after this statement y = 3
    Console.WriteLine("--y: {0}", --y);

    Console.ReadKey();
}

打印出來

x++: 4
++x: 6
y--: 4
--y: 2

讓我們看一下從該語句生成的IL

IL_0002:  ldloc.0     

將x的值加載到堆棧上。 堆棧=>(4)

IL_0003:  dup         

復制堆棧中最頂層的項目。 堆棧=>(4,4)

IL_0004:  ldc.i4.1    

將1推入堆棧。 堆棧=>(1,4,4)

IL_0005:  sub         

減去兩個頂部值並將結果推入堆棧。 堆棧=>(3,4)

IL_0006:  stloc.0     

將堆棧的最高值存儲回x。 堆棧=>(4)

IL_0007:  ldloc.0     

將x的值加載回堆棧。 堆棧=>(3,4)

IL_0008:  ldc.i4.1    

將值1加載到堆棧上。 堆棧=>(1,3,4)

IL_0009:  sub         

減去這兩個。 堆棧=>(2,4)

IL_000A:  dup         

重復頂部值=>(2,2,4)

IL_000B:  stloc.0     

將最高值存儲回x。 堆棧=>(2,4)

IL_000C:  sub      

減去兩個最高值。 堆棧=>(2)

IL_000D:  stloc.0  

將此值存儲回x。 x == 2

來自你的評論:

我認為在評估完整代碼行之后/之前執行后增量和前增量 - 但是它們在表達式中每個項目的評估之后/之前執行。

你的誤解是一個非常普遍的誤解。 請注意,在某些語言(如C)中,當副作用變得可見時未指定,因此在C中您的語句為真,因此它是合法的,但不是必需的。

在C#中並非如此; 在C# 中,表達式左側代碼的副作用總是在右側代碼執行之前發生 (來自單個線程;在多線程場景中,所有投注都關閉。)

有關增量運算符在C#中執行的操作的更詳細說明,請參閱:

i ++和++ i有什么區別?

我在這個經常被誤解的主題上撰寫的文章還有很多其他鏈接。

最有趣的是你會得到一個完全不同的答案用C ++ .Net編譯器。

int x = 4;
x = x++ + ++x; // x = 11
x = 4;
x = x-- - --x; // x = -1

當然,結果的差異取決於不同的語義 - 看起來很正常。 但是,盡管理解兩個.net編譯器對於這樣的基本事物沒有類似的行為這一事實也讓我感到困惑。

在這個例子中,

int x = 4;
x = x++ + ++x;

你可以打破它:

x = 4++; which is = 5
x = 4 + ++5; which is 4 + 6
x = 10

同樣的,

int x = 4;
x = x-- - --x;

這里,

x = 4--; which is = 3
x = 4 - --3; which is 4 - 2
x = 2

簡單地說,你可以說,替換x的當前值,但是對於每個++或 - 從x中添加/減去一個值。

我認為++ + ++案例的解釋是錯誤的:

命令...........x的值

..................未定義

int x = 4 .......... 4

x ++ ............... 5(第一個加數是4)

++ x ............... 6(第二個加數為6)

x = summand1 + summand2 ..4 + 6 = 10

類似於 - - - 案例的解釋是

命令...........x的值

..................未定義

int x = 4 .......... 4

x - ............ 3(子接收器為4)

--x ............... 2(減數為2)

x =減法器 - 減數..4-2 = 10

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM