++我+ I ++评价(++i+i++ evaluation)

2019-09-01 22:00发布

混乱上涨,因为这个职位 。 作者更新他的岗位,结果变得清晰。 结论:Java的评估左到右的表达式

关闭!

作为表达的评价是从右到左下面的代码应该存储做5j

int i=2;
int j=++i+i++;
System.out.println(j);

但我得到6作为输出,这迫使我重新思考到左评估想法的权利 。 请在这里解释理论。

Answer 1:

int i = 2;
int j = ++i + i++;

是相同的

int i = 2;

// This part is from ++i
i = i + 1;
int left = i; // 3

// This part is from i++
int right = i; // 3
i = i + 1;

int j = left + right; // 3 + 3 = 6

相反,如果你做:

int i = 2;
int j = i++ + ++i;

这将是等效于:

int i = 2;

// This part is from i++
int left = i; // 2
i = i + 1;

// This part is from ++i
i = i + 1;
int right = i; // 4


int j = left + right; // 2 + 4 = 6

因此总和是一样的,但被概括条款是不同的。



Answer 2:

你得到6,因为它是3 + 3

  • 第一OP是++i哪个递增第一 (3),则使用该值
  • 接下来OP是+i这又增加了3
  • 最后OP ++不参加此外,但使用它后我递增


Answer 3:

你的假设是错误的。 以下是文件说:

除了赋值运算符所有的二元运算符从左向右评估

所以

++i+i++

相当于

(++i)+(i++)

其中++i首先计算。

这使

3+3

这是6 (和i具有值4在此之后)。



Answer 4:

第一++ i递增。 在+增加了我自己。 i是3。



Answer 5:

你从哪儿弄来的想法,它是从右到左? 这是左到右。

什么是Java中的计算顺序的规则?



Answer 6:

这究竟是怎么工作的,因为一元运算符比二进制更precedance:

int i=2;
int j =(++i)+(i++);
        ^^^   ^^^ 
         3  +(i++) //The value of i is now 3.
        ^^^   ^^^
         3  +  3   //The value of i is incremented after it is assigned.


Answer 7:

当评估一个表达式,如a+b ,然后才能添加“B”到“A”,你需要知道什么“一”的。 在这种情况下,a是++ I,其为3,并且b为i ++是3.评价从右到左给出3 + 3 = 6



Answer 8:

在Java和C#,子表达式的评估将完成左到右:

int j=++i + i++;

包含以下两个子表达式++ii++ 。 这些子表达式将在此为了使这将转化为进行评估:

int j= 3 + 3;

如Java和C#中, ++i将被执行返回3 ,但我将改为3所述第二前i++ 。 所述第二返回的当前值i3现在和以后i++的值i将是4

在C ++中,这将是不确定的。

而在现实世界中,你不想输入此代码(除代码高尔夫)



文章来源: ++i+i++ evaluation