一个变量可以在一条语句中递增多少次?
How many times could a variable be incremented in a single statement?
我目前正在阅读 Barry Burd 的 Java For Dummies,并想到了这个小练习。
练习是关于post和预增量的。在问题中(请参阅代码)我能够找出所有行的答案(没有编译器的帮助)除了最后一行。根据我目前对 post/pre-increment 的了解,这没有意义。
请告知结果如何或为何与我的预期不符。
我尝试初始化并声明一个值为“20”的新变量 (int),然后 "i = i++ + i++",但仍然收到相同的结果 (41)。
也试过 out.println(i) 两次,但它仍然打印 41.
import static java.lang.System.out;
public class Main
{
public static void main(String[] args) {
int i = 10;
out.println(i++); //10(post11)
out.println(--i); //10(pre11-1)
--i; //9(pre10-1)
i--; //9(post8)
out.println(i); //8
out.println(++i); //9(pre8+1)
out.println(i--); //9(post8)
out.println(i); //8
i++; //8(post9)
i = i++ + ++i; //i = 9(post10) + 10(pre9+1) = 19(post20)
out.println(i); //20
i = i++ + i++; //i = 20(post21) + 20(post21) = 40(post42)
out.println(i); //41 (result copied from compiler)
}
}
我希望最后一行打印 42 而不是 41,因为“20”被添加了两次,并且也增加了两次。
i = i++ + i++
计算结果为(如果 i 为 20):
i = 20 + 21
因为第一个 i++
是一个 post 运算符,所以不会影响它。但是,它确实会影响 i
.
的下一次使用
我会一步步分解:
i =
i++
+ i++;
,i == 20
i =
20
+ i++
,i == 21
i = 20 +
i++
,i == 21
i = 20 +
21
,i == 22
i =
41
当您使用赋值运算符 (=) 时,它是在 post 递增运算符之后完成的。因此你得到这个:
int i = 10;
i = i++;
System.out.println(i); // print 10
当你在同一行中两次使用post递增时,不是在该行完成后递增,而是在指令完成后递增(指令为i++)。因此,当执行 i = i++ + i++ 时;你实际上是在这样做:
i = i++ + i++; // i=20 Original code
i = 20 + i++; // i=21 The first i++ return 20 then increment i to 21
i = 20 + 21; // i=22 The second i++ return 21 then increment i to 22
i = 41; // i=22 The addition is computed
41; // i=41 and assigne to i
这一切都与运算符优先级有关。
您可以通过编写自己的打印例程来查看发生了什么。
int i = 9;
i = print(i++) + print(++i); // i = 9(post10) + 10(pre9+1) = 19(post20)
System.out.println("\n" + i); // 20
i = print(i++) + print(i++); // i = 20(post21) + 20(post21) = 40(post42)
System.out.println("\n" + i); // 41 (result copied from compiler)
public static int print(int i) {
System.out.print(" i = " + i + " ");
return i;
}
我目前正在阅读 Barry Burd 的 Java For Dummies,并想到了这个小练习。
练习是关于post和预增量的。在问题中(请参阅代码)我能够找出所有行的答案(没有编译器的帮助)除了最后一行。根据我目前对 post/pre-increment 的了解,这没有意义。
请告知结果如何或为何与我的预期不符。
我尝试初始化并声明一个值为“20”的新变量 (int),然后 "i = i++ + i++",但仍然收到相同的结果 (41)。
也试过 out.println(i) 两次,但它仍然打印 41.
import static java.lang.System.out;
public class Main
{
public static void main(String[] args) {
int i = 10;
out.println(i++); //10(post11)
out.println(--i); //10(pre11-1)
--i; //9(pre10-1)
i--; //9(post8)
out.println(i); //8
out.println(++i); //9(pre8+1)
out.println(i--); //9(post8)
out.println(i); //8
i++; //8(post9)
i = i++ + ++i; //i = 9(post10) + 10(pre9+1) = 19(post20)
out.println(i); //20
i = i++ + i++; //i = 20(post21) + 20(post21) = 40(post42)
out.println(i); //41 (result copied from compiler)
}
}
我希望最后一行打印 42 而不是 41,因为“20”被添加了两次,并且也增加了两次。
i = i++ + i++
计算结果为(如果 i 为 20):
i = 20 + 21
因为第一个 i++
是一个 post 运算符,所以不会影响它。但是,它确实会影响 i
.
我会一步步分解:
i =
i++
+ i++;
,i == 20
i =
20
+ i++
,i == 21
i = 20 +
i++
,i == 21
i = 20 +
21
,i == 22
i =
41
当您使用赋值运算符 (=) 时,它是在 post 递增运算符之后完成的。因此你得到这个:
int i = 10;
i = i++;
System.out.println(i); // print 10
当你在同一行中两次使用post递增时,不是在该行完成后递增,而是在指令完成后递增(指令为i++)。因此,当执行 i = i++ + i++ 时;你实际上是在这样做:
i = i++ + i++; // i=20 Original code
i = 20 + i++; // i=21 The first i++ return 20 then increment i to 21
i = 20 + 21; // i=22 The second i++ return 21 then increment i to 22
i = 41; // i=22 The addition is computed
41; // i=41 and assigne to i
这一切都与运算符优先级有关。
您可以通过编写自己的打印例程来查看发生了什么。
int i = 9;
i = print(i++) + print(++i); // i = 9(post10) + 10(pre9+1) = 19(post20)
System.out.println("\n" + i); // 20
i = print(i++) + print(i++); // i = 20(post21) + 20(post21) = 40(post42)
System.out.println("\n" + i); // 41 (result copied from compiler)
public static int print(int i) {
System.out.print(" i = " + i + " ");
return i;
}