2012-07-17 35 views
2

有關C#++(右置)運算符的問題。C#++一元運算符增量問題

作爲左放置++運算符,例如,++ var(例如保持int值爲1)將在任何其他計算髮生之前遞增1(在執行expression後,示例值1將變爲2並顯示結果)。

任何人都可以解釋左放置運算符和右放置運算符之間的區別嗎? (var ++),因爲即使在表達式被執行之後,它似乎也不會增加,因爲它應該這樣做。下面是一些示例代碼:

 int var1, var2 = 5, var3 = 6; 

     var1 = var2++ * --var3; 
     Console.WriteLine(" {0} ", var1); 
     Console.ReadKey(); 

這僅僅是5×5由於VAR3的遞減但沒有減量爲5×6和VAR2 ++似乎具有比5它所攜帶的值以外沒有影響。如果有人能夠闡明這個話題,我將不勝感激。謝謝。

***問題已解決。很多偉大的答案和輸入的人,很難決定接受什麼答案,但你們都是贏家!再次感謝您的幫助! =)

+0

也許UR混亂是因爲編譯器盡一切自1個語句 – bresleveloper 2012-07-17 07:29:22

+0

這是最好的說明如下1次射門[我++ VS ++ I](http://stackoverflow.com/a/3346729/570150 ) – V4Vendetta 2012-07-17 07:30:57

+0

這也許是有幫助的http://stackoverflow.com/q/8573190/621334 – Purplegoldfish 2012-07-18 08:58:06

回答

4

++x(前綴增量)在之前遞增值評估表達式。因此它首先增加值然後返回。

x++(後綴增量)在之後增加值評估表達式。因此,它會返回未更改的值,只有在此之後,x纔會增加。

var1 = var2++ * --var3;後,var2實際上是6,因爲它增加它的價值進行評估之後。

所以,你的代碼:

var1 = var2++ * --var3; 

做這樣的事情:

int oldVar2 = var2; 
var2 = var2 + 1; 
var3 = var3 - 1; 
var1 = oldVar2 * var3; 
+0

很多偉大的答案和輸入的傢伙,很難決定接受什麼答案,但你們都是贏家!再次感謝您的幫助! =) – wilbomc 2012-07-17 19:09:30

5
 int var1, var2 = 5, var3 = 6; 

     var1 = var2++ * --var3; 
     Console.WriteLine(" {0} ", var1); 
     Console.WriteLine(" {0} ", var2); 
     Console.ReadKey(); 

輸出:

所以var2如預期的那樣遞增。

2

在C#中的只有差分運算和right-placed之間left-placed操作是計算後的實際返回值

如果是left-hand運營商,則返回新增或增加值。

right-hand運營商的情況下,返回的值是「老」之一,即使真正值增加。

但重要的是要知道,序列在兩種情況下執行的操作正是相同。

1

var2值後評價乘法遞增; var3的值在評估之前遞減;它可以大致概念化爲:

var tmp = var2; // 5 
    var2 = var2 + 1; // 5 + 1 = 6 
    var3 = var3 - 1; // 6 - 1 = 5; 
    var1 = tmp * var3; // 5 * 5 = 25; 

所以25是正確的。如果您檢查var2,您會發現它已按預期遞增。

但是!如果一個涉及++foobar--的複雜計算會令人困惑,那麼只需就不會內聯;將計算分解成更簡單的部分,然後執行。編譯器不會判斷你。

+0

「var2值在乘法評估之後遞增」。即使根據您的樣本,這種說法也是不正確的。 – Polity 2012-07-17 08:01:47

+0

@Polity否,「乘法評估」是將值存儲在'tmp'中的地方。請注意,它在**之前執行此操作**將增加'var2'的值。實際上,它將作爲一個自由價值堆疊,而不是在指定的本地,但是:同樣的效果。 – 2012-07-17 11:59:33

0

這裏是前綴後綴增量運營商的一些示例類槓桿的概念。代碼的寫法使得輸出更清晰。

public class Test 
    { 
      public Test() 
      { } 


     public static void Main(string[] args) 
     { 
      int i = 0; 

      Console.WriteLine("\n" + "Displaying Initial   i  =  " + i + "\n"); // Prints 0 i.e. Initial value of i 

      Console.WriteLine("\n" + "Displaying PostFix   i++ =  " + i++ + "\n"); // Prints 0. Then value of i becomes 1. 

      Console.WriteLine("\n" + "Displaying Post-incremented i  =  " + i + "\n"); // Prints 1 i.e. Value of i after Post-increment 

      Console.WriteLine("\n" + "Displaying PreFix    ++i =  " + ++i + "\n"); // Prints 2. Then value of i incremented to 2 

      Console.WriteLine("\n" + "Displaying Pre-incremented i  =  " + i + "\n"); // Prints 2 i.e. Value of i after Pre-increment 

      Console.WriteLine("\n" + "---------------------------------------------" + "\n"); 

      int j = 0; 

      Console.WriteLine("\n" + "Displaying Initial   j  =  " + j + "\n"); // Prints 0 i.e. Initial value of j 

      Console.WriteLine("\n" + "Displaying PreFix    ++j =  " + ++j + "\n"); // Prints 1. Then value of j incremented to 1. 

      Console.WriteLine("\n" + "Displaying Pre-incremented j  =  " + j + "\n"); // Prints 1 i.e. Value of j after Pre-increment 

      Console.WriteLine("\n" + "Displaying PostFix   j++ =  " + j++ + "\n"); // Prints 1. Then value of j incremented to 2. 

      Console.WriteLine("\n" + "Displaying Post-incremented j  =  " + j + "\n"); // Prints 2 i.e. Value of j after Post-increment 

      Console.ReadLine(); 
     } 
    }