7

很长一段时间我都以为我明白了,我打算创造一些谜题来向我的一些“学生”学习 C# 中运算符优先级的主题。但结果表明我仍然没有做对。</p>

谜题:这里的输出是什么?

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……现在我正在尝试应用运算符优先规则和评估顺序,但不确定我是否向自己解释过。今天又读了几次这篇文章,但还是不太明白为什么这里的结果是-1?有人可以帮助如何评估第二个结果。为什么以及如何与第一个不同?

4

5 回答 5

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。

于 2013-04-30T23:06:20.997 回答
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

这正是编译器处理这种情况的方式;编译器在优化临时变量方面更加聪明。如果您将表达式分解为更简单的步骤,分析表达式会变得很容易。

于 2013-04-30T23:46:02.803 回答
2
int b = 0;
int y = b-- + b++;

逐步分解:

y = b--

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

+ b++

在这里,y (0) 被添加到 b(在上一步中减少到 -1)等于-1,然后 b 增加到零。输出:

-1 0
于 2013-04-30T23:09:00.427 回答
0

后缀--/++返回变量的原始值。所以:

用你的例子b-- + b++

  • b--表示递减b,返回原值。所以b = b - 1, bis now -1,表达式的值 is 0
  • b++表示增量b,返回原值。所以b = b + 1, bis now 0,表达式的值 is -1
  • 那么,0 + -1 == -1。这是y. b还在0
于 2013-04-30T23:09:41.727 回答
0

这个问题已经回答了,但我想以另一种方式陈述答案。

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

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

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

剩下的表达式0 + -1-1

于 2013-05-01T16:37:13.150 回答