繁体   English   中英

++ —运算符优先级难题

[英]++ — Operator precedence puzzle

长期以来,我一直以为自己会明白,因此我将创建一些难题,以学习一些有关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 ...现在我试图应用运算符优先级规则和求值顺序,并且不确定我向自己解释了它。 今天再读几次该帖子 ,但仍然不太明白为什么这里的结果为-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++;

相当于

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

逐步分解:

y = b--

在此,将y设置为b(0),然后将b减为-1

+ b++

在此,将y(0)加到等于-1 b(在上一步中减为-1),然后b递增为零。 输出:

-1 0

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

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

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

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

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

表达式b--求值为0 (b的原始值),并且具有将b递减为-1的副作用(在求值后应用)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM