C# ++;——算子优先问题

C# ++;——算子优先问题,c#,C#,很长一段时间以来,我一直认为我懂了,我打算制作一些谜题来学习我的一些“学生”关于c#中运算符优先级的主题。 但事实证明,我还是不明白。 谜题: 这里的输出是什么 int a = 0; int x = --a + a++; Console.WriteLine(x); Console.WriteLine(a); 输出: -二, 0 这里一切正常,我预料到了 接下来,问题一: int b = 0; int y = b-- + b++; Console.WriteLine(y

很长一段时间以来,我一直认为我懂了,我打算制作一些谜题来学习我的一些“学生”关于c#中运算符优先级的主题。 但事实证明,我还是不明白。

谜题: 这里的输出是什么

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

-二, 0

这里一切正常,我预料到了

接下来,问题一:

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

-一, 0

嗯,这里我也期望y是-2…现在我尝试应用操作符优先级规则和求值顺序,但不确定我是否向自己解释了。 今天再读几遍,但仍然不太明白为什么这里的结果是-1? 有人能帮我解释一下第二个结果是如何计算的吗?为什么和第一个结果有什么不同?

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

int b = 0;
int y = b-- + b++;
按步骤分解:

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

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

-1 0
后缀
--
/
++
返回变量的原始值。因此:

以您的示例
b--+b++

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

按照编译器所做的去做:慢慢地把它分解成等价的程序

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;
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;
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

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

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

int b = 0;
int y = b-- + b++;
表达式
b--
的计算结果为
0
(b的原始值),并具有将b减至-1的副作用(在计算后应用)

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


这留下了表达式
0+-1
,它是
-1

谢谢,这一定是对的..看起来我有点生疏了。我从来没有想到b--在左操作数中计算为0,但在右操作数中留下-1。谢谢,这在处理“高级”时是有意义的这些基本的编程概念往往会变得“神奇”。我总是坚持思考幕后的事情是如何运作的。在这里我没有这样做,但这是一个很好的提醒。
+ b++