2012-07-17 91 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(); 
     } 
    }