java 初学者,运算符优先 table
java beginner, operator precedence table
我查看运算符优先级 table 和 ++ 运算符在 = 运算符之前。但是要计算这个表达式,
b=a++;
首先,a 被分配给 b,然后 a 递增。
这令人困惑。 ++ 或 = 哪个先出现?
例如,您可以阅读 this tutorial,它表示 increment/decrement 运算符具有最高优先级,而赋值运算符具有最低优先级。因此,在您的示例中,首先 a++
将被执行,然后 a
的先前值将被分配给 b
.
请注意,即使使用括号也无法更改您的案例中的优先级:(b=a)++
是编译错误。
是的,++
的 precedence 高于 =
。但是您需要将 ++
post 递增运算符视为 2 个操作——递增变量并产生旧值——它们发生在优先级较低的运算符 =
之前。
事情是这样的:
- Post-自增运算符
++
:自增a
.
- Post-increment Operator
++
: Yield the old value of a
.
- 运算符
=
:将a
的旧值赋值给b
。
相当于这段代码。
int resultOfPostIncrement = a;
a = a + 1;
b = resultOfPostIncrement;
与许多人似乎认为的相反,当我们写 int b = a++;
时,b
在递增 a
之前没有被赋值。它被分配了 a
的 前 值,但在时间轴上 later 比 a
的实际增量。
因此,它与优先级告诉您的并不矛盾。
为了说服你,这里有一个让我信服的小例子:
int a = 1;
int b = a++ + a++;
最后,b
等于3,不是2,a
也是3。因为优先级的关系是:
- 左边的
a++
首先求值,递增 a
,但根据运算符 的定义,仍然求值为之前的值 1
- 右
a++
被求值,读取新值2(证明第一次递增已经发生),递增到3,但还是求值到2
- 求和
1 + 2
,赋值给b
这是因为您应该将 a++
视为指令和表达式。
- 指令递增
a
- 表达式的计算结果为
a
的前一个值
和b = a
一样的东西,也是指令和表达式:
- 指令将
a
的值赋值给b
- 表达式的计算结果为指定的值
我查看运算符优先级 table 和 ++ 运算符在 = 运算符之前。但是要计算这个表达式, b=a++; 首先,a 被分配给 b,然后 a 递增。 这令人困惑。 ++ 或 = 哪个先出现?
例如,您可以阅读 this tutorial,它表示 increment/decrement 运算符具有最高优先级,而赋值运算符具有最低优先级。因此,在您的示例中,首先 a++
将被执行,然后 a
的先前值将被分配给 b
.
请注意,即使使用括号也无法更改您的案例中的优先级:(b=a)++
是编译错误。
是的,++
的 precedence 高于 =
。但是您需要将 ++
post 递增运算符视为 2 个操作——递增变量并产生旧值——它们发生在优先级较低的运算符 =
之前。
事情是这样的:
- Post-自增运算符
++
:自增a
. - Post-increment Operator
++
: Yield the old value ofa
. - 运算符
=
:将a
的旧值赋值给b
。
相当于这段代码。
int resultOfPostIncrement = a;
a = a + 1;
b = resultOfPostIncrement;
与许多人似乎认为的相反,当我们写 int b = a++;
时,b
在递增 a
之前没有被赋值。它被分配了 a
的 前 值,但在时间轴上 later 比 a
的实际增量。
因此,它与优先级告诉您的并不矛盾。
为了说服你,这里有一个让我信服的小例子:
int a = 1;
int b = a++ + a++;
最后,b
等于3,不是2,a
也是3。因为优先级的关系是:
- 左边的
a++
首先求值,递增a
,但根据运算符 的定义,仍然求值为之前的值 1
- 右
a++
被求值,读取新值2(证明第一次递增已经发生),递增到3,但还是求值到2 - 求和
1 + 2
,赋值给b
这是因为您应该将 a++
视为指令和表达式。
- 指令递增
a
- 表达式的计算结果为
a
的前一个值
和b = a
一样的东西,也是指令和表达式:
- 指令将
a
的值赋值给b
- 表达式的计算结果为指定的值