Roberto Asked:2020-04-01 04:37:59 +0000 UTC2020-04-01 04:37:59 +0000 UTC 2020-04-01 04:37:59 +0000 UTC 赋值和自增操作,解释一下哪里错了? 772 有一个小代码片段可以理解java int i = 0; i = i++; System.out.println(i); 我期望看到的: -i 设置为 0 i 的值(即零)并分配给 i 现在为 0。通过递增增加 i 的值 - 得到 1 我希望我会在控制台中收到 1,但我得到零。为什么? java 3 个回答 Voted coolsv 2020-04-01T05:03:27Z2020-04-01T05:03:27Z Java中的增量有两种形式,后缀: i++ 和前缀: ++i 在后缀形式中,先进行赋值操作,再进行自增操作。因此,您的变量永远不会改变它的值。 为了使表达式起作用,必须使用前缀形式,它保证了在对变量进行操作期间递增的优先级。 Best Answer default locale 2020-04-01T12:16:14Z2020-04-01T12:16:14Z 这里至少有两点需要明确。 赋值运算符 ( =) 的优先级低于增量运算符 ( ++)。 根据 Java 规范(第 15.2.6.1 节),赋值运算符首先计算右侧,然后进行赋值。所以步骤 2 和 3 需要颠倒过来。 后缀增量运算符返回变量的前一个值。 根据 Java 规范 ( §15.4.2 ), ( ) 运算符i++将 1 加到变量中,但返回变量在作为操作结果递增之前的值。++i这与 ( ) 运算符的前缀形式不同。 为了更容易理解,使用不同的变量进行增量和赋值,更难混淆: int i = 0; int a = i++; //a = 0, т.к. возвращается значение до увеличения //i = 1, переменная увеличивается int j = 0; int b = ++j; //b = 1, т.к. возвращается значение после увеличения //j = 1, переменная увеличивается 现在您可以对这里发生的事情进行描述: 我被赋值为 0 处理表达式的右侧。运算符 ( i++) 递增变量 ( i=1) 的值并返回递增 ( 0) 之前的值。 执行赋值运算符:i从右侧返回的值 0 ( i=0) 被赋值。 user176262 2020-04-01T04:42:48Z2020-04-01T04:42:48Z i = i++; __temp = i; i = i + 1; i = __temp; 右侧的所有操作都发生在分配左侧的值之前。
Java中的增量有两种形式,后缀:
和前缀:
在后缀形式中,先进行赋值操作,再进行自增操作。因此,您的变量永远不会改变它的值。
为了使表达式起作用,必须使用前缀形式,它保证了在对变量进行操作期间递增的优先级。
这里至少有两点需要明确。
赋值运算符 (
=) 的优先级低于增量运算符 (++)。根据 Java 规范(第 15.2.6.1 节),赋值运算符首先计算右侧,然后进行赋值。所以步骤 2 和 3 需要颠倒过来。
后缀增量运算符返回变量的前一个值。
根据 Java 规范 ( §15.4.2 ), ( ) 运算符
i++将 1 加到变量中,但返回变量在作为操作结果递增之前的值。++i这与 ( ) 运算符的前缀形式不同。为了更容易理解,使用不同的变量进行增量和赋值,更难混淆:
现在您可以对这里发生的事情进行描述:
i++) 递增变量 (i=1) 的值并返回递增 (0) 之前的值。i从右侧返回的值 0 (i=0) 被赋值。右侧的所有操作都发生在分配左侧的值之前。