C# ++;——算子优先问题
很长一段时间以来,我一直认为我懂了,我打算制作一些谜题来学习我的一些“学生”关于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
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++