++ - 运算符优先级拼图

时间:2013-04-30 23:02:57

标签: c#

很长一段时间我以为我明白了,我打算创建一些谜题来学习一些关于c#中运算符优先级主题的“学生”。 但结果是我仍然没有做对。 

困惑: 这里的输出是什么?

int a = 0;            
int x = --a + a++;
Console.WriteLine(x);
Console.WriteLine(a);

输出:

-2 0

一切都清楚了,我期待这个

接下来,问题一:

int b = 0;
int y = b-- + b++;
Console.WriteLine(y);
Console.WriteLine(b);

输出:

-1 0

好吧,在这里我也期望y为-2 ......现在我正在尝试应用运算符优先级规则和评估顺序,并且不确定我是否自己解释过。 今天再次阅读this post几次,但仍然不明白为什么结果为-1? 有人可以帮助评估第二个结果。为什么以及它与第一个有什么不同?

5 个答案:

答案 0 :(得分:15)

b--是后减量。所以:

b-- returns zero and subtracts 1 from b, leaving -1 in b.

b++ returns the -1 from the last step and adds 1, leaving 0 in b.

加法的最终结果:-1。

答案 1 :(得分:10)

执行编译器所做的事情:将其慢慢地分解为等效的程序。

int b = 0;
int y = b-- + b++;

相当于

int b, y;
b = 0;
y = b-- + b++;

相当于

int b, y;
b = 0;
int leftAddend = b--;
int rightAddend = b++;
y = leftAddend + rightAddend;

相当于

int b, y;
b = 0;
int originalb1 = b;
int newb1 = originalb1 - 1;
b = newb1;
int leftAddend = originalb1;
int originalb2 = b;
int newb2 = originalb2 + 1;
b = newb2;
int rightAddend = newb2;
y = leftAddend + rightAddend;

现在用它的值注释每个:

int b, y;
b = 0;                       // b is now 0
int originalb1 = b;          // originalb1 is now 0
int newb1 = originalb1 - 1;  // newb1 is now -1
b = newb1;                   // b is now -1
int leftAddend = originalb1; // leftAddend is now 0
int originalb2 = b;          // originalb2 is now -1 
int newb2 = originalb2 + 1;  // newb2 is now 0
b = newb2;                   // b is now 0
int rightAddend = originalb2;// rightAddend is now -1
y = leftAddend + rightAddend;// y is now -1

这正是编译器处理这种情况的方式;编译器在优化临时工作方面更加聪明一点。如果你只是将分解为更简单的步骤,那么分析表达式就变得容易了。

答案 2 :(得分:2)

int b = 0;
int y = b-- + b++;

逐步分解:

y = b--

这里,y设置为b(0),然后b减少为-1

+ b++

这里,y(0)被加到b(在prev步骤中递减到-1)等于-1,然后b递增到零。输出:

-1 0

答案 3 :(得分:0)

Postfix -- / ++会返回变量的原始值。所以:

使用您的示例b-- + b++

  • b--表示递减b,返回原始值。因此,b = b - 1b现在为-1,表达式的值为0
  • b++表示增量b,返回原始值。因此,b = b + 1b现在为0,表达式的值为-1
  • 然后,0 + -1 == -1。这是yb仍为0

答案 4 :(得分:0)

这个问题已得到解答,但我想以另一种方式说明答案。

int b = 0;
int y = b-- + b++;

表达式b--的计算结果为0(b的原始值),并且具有将b递减到-1的副作用(在评估后应用)。

表达式b++的计算结果为-1(由于之前的副作用),并且具有将b递增为0的副作用(在评估后应用)。

这使得表达式0 + -1-1