java中的增量顺序
为什么在java中此代码输出1:java中的增量顺序,java,operator-precedence,evaluation,post-increment,jls,Java,Operator Precedence,Evaluation,Post Increment,Jls,为什么在java中此代码输出1: int bracketsTest = 0; int resultBrackets = 1 + bracketsTest + bracketsTest++; // return 1 但这将产生2: int bracketsTest = 0; int resultBrackets = 1 + bracketsTest++ + bracketsTest; // return 2 我生活在一个两个片段应该相等的世界,因为在这两个结果中,我们都做了以下事情: 1+0+
int bracketsTest = 0;
int resultBrackets = 1 + bracketsTest + bracketsTest++; // return 1
但这将产生2:
int bracketsTest = 0;
int resultBrackets = 1 + bracketsTest++ + bracketsTest; // return 2
我生活在一个两个片段应该相等的世界,因为在这两个结果中,我们都做了以下事情:但事实证明,递增/递减操作不是最高优先级的操作?(因为在代码段中放括号是很重要的)
第二个加法表达式从左到右求值,如下所示:
int resultBrackets = 1 + bracketsTest++ + bracketsTest;
1 (add 1)
bracketsTest++ (add zero, then increment bracketsTest by 1)
bracketsTest (add 1, the current value of bracketsTest)
因此,总和的计算结果为2。第二个加法表达式从左到右计算,如下所示:
int resultBrackets = 1 + bracketsTest++ + bracketsTest;
1 (add 1)
bracketsTest++ (add zero, then increment bracketsTest by 1)
bracketsTest (add 1, the current value of bracketsTest)
因此,总和计算为2。计算顺序
您似乎将运算符先行性与求值顺序混为一谈。请看一看:
Java编程语言保证运算符的操作数按特定的求值顺序求值,即从左到右
此外:
Java编程语言保证在执行操作本身的任何部分之前,运算符的每个操作数(条件运算符&&、| |和?:)都是完全求值的
此外:
Java编程语言尊重括号显式表示的求值顺序和运算符优先级隐式表示的求值顺序
但是,只有在您执行操作本身时,该部分才会起作用。在此之前,所有操作数都将被完全计算
第一段 知道了这一点,我们就能破译正在发生的事情。第一段:
1 + bracketsTest + bracketsTest++
将首先计算所有操作数(从左到右),因此我们得到:
1. operand: 1
2. operand: 0
3. operand: 0 (and increment bracketsTest)
在计算第三个操作数时,它将递增方括号ST
。现在,它将所有内容相加,我们得到1+0+0=1
第二段 第二段:
1 + bracketsTest++ + bracketsTest;
也从左到右进行计算,因此我们有:
1. operand: 1
2. operand: 0 (and increment bracketsTest)
3. operand: 1 (because it was just incremented)
因此,我们收到1+0+1=2
评估订单
您似乎将运算符先行性与求值顺序混为一谈。请看一看:
Java编程语言保证运算符的操作数按特定的求值顺序求值,即从左到右
此外:
Java编程语言保证在执行操作本身的任何部分之前,运算符的每个操作数(条件运算符&&、| |和?:)都是完全求值的
此外:
Java编程语言尊重括号显式表示的求值顺序和运算符优先级隐式表示的求值顺序
但是,只有在您执行操作本身时,该部分才会起作用。在此之前,所有操作数都将被完全计算
第一段 知道了这一点,我们就能破译正在发生的事情。第一段:
1 + bracketsTest + bracketsTest++
将首先计算所有操作数(从左到右),因此我们得到:
1. operand: 1
2. operand: 0
3. operand: 0 (and increment bracketsTest)
在计算第三个操作数时,它将递增方括号ST
。现在,它将所有内容相加,我们得到1+0+0=1
第二段 第二段:
1 + bracketsTest++ + bracketsTest;
也从左到右进行计算,因此我们有:
1. operand: 1
2. operand: 0 (and increment bracketsTest)
3. operand: 1 (because it was just incremented)
因此我们收到
1+0+1=2
第一个执行1+0+0
。最后一个执行1+0+1
,因为变量在读取最后一个加数(+bracketsTest;
)之前已经递增。我确信JLS准确地指定了这个代码段必须在某处执行的顺序(在本例中是从左到右)。您似乎在混合运算符优先级和求值顺序<代码>+的优先级高于+
,但是在Java中,求值顺序总是从左到右。任何++符号都意味着递增变量,因此,如果使用++bracketsTest
,则意味着将递增它,然后使用它;如果使用bracketsTest++
,则意味着我现在将使用它的旧值,然后在任何下一次使用中,我将使用递增的值价值因此,在第二个示例中,您将其递增,并在其后使用,因此您将获得递增的值,这就是为什么第二个示例在JLS中显示2,并首先显示1估价顺序:第一个执行1+0+0
。最后一个执行1+0+1
,因为变量在读取最后一个加数(+bracketsTest;
)之前已经递增。我确信JLS准确地指定了这个代码段必须在某处执行的顺序(在本例中是从左到右)。您似乎在混合运算符优先级和求值顺序<代码>+的优先级高于+
,但是在Java中,求值顺序总是从左到右。任何++符号都意味着递增变量,因此,如果使用++bracketsTest
,则意味着将递增它,然后使用它;如果使用bracketsTest++
,则意味着我现在将使用它的旧值,然后在任何下一次使用中,我将使用递增的值价值所以在第二个例子中,你增加了它,然后使用它,所以你会得到增加的值,这就是为什么第二个例子在JLS中显示2并首先显示1评估顺序:在再次阅读OPs问题后,我认为他已经知道了,但他问的是为什么顺序是这样的,以及在哪里(在JLS中)写下并解释了这一点。但可能是错误的……我已经一步一步地解释了我们如何得出2的总和。在再次阅读OPs问题后,我认为他已经知道了这一点,但他更想问的是,为什么订单是这样的,以及在哪里(在JLS中)写下并解释了这一点。可能是错的,但我