很长一段时间我以为我明白了,我打算创建一些谜题来学习一些关于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? 有人可以帮助评估第二个结果。为什么以及它与第一个有什么不同?
答案 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 - 1
,b
现在为-1
,表达式的值为0
。b++
表示增量b,返回原始值。因此,b = b + 1
,b
现在为0
,表达式的值为-1
。0 + -1 == -1
。这是y
。 b
仍为0
。答案 4 :(得分:0)
这个问题已得到解答,但我想以另一种方式说明答案。
int b = 0;
int y = b-- + b++;
表达式b--
的计算结果为0
(b的原始值),并且具有将b递减到-1的副作用(在评估后应用)。
表达式b++
的计算结果为-1
(由于之前的副作用),并且具有将b递增为0的副作用(在评估后应用)。
这使得表达式0 + -1
为-1
。