3

有人可以帮我理解为什么:

int i=1;
int j=1;
int k=1;
int l=1;

System.out.println(i++ + i++);  
System.out.println(++j + ++j);  
System.out.println(k++ + ++k);  
System.out.println(++l + l++);

给:

3
5
4
4

4

5 回答 5

15

变量++ 表示:在评估表达式之后增加变量。

++Variable 表示:在计算表达式之前增加变量。

这意味着,将您的示例转换为数字:

System.out.println(i++ + i++);  //1 + 2
System.out.println(++j + ++j);  //2 + 3
System.out.println(k++ + ++k);  //1 + 3
System.out.println(++l + l++);  //2 + 2

这是否澄清了事情,还是您需要进一步的解释?

需要注意的是:'println' 之后所有这些变量的值等于 '3'。

自从 OP 询问以来,这里有一个小“用例”,说明这种行为实际上在哪里有用。

int i = 0;
while(++i < 5) {           //Checks 1 < 5, 2 < 5, 3 < 5, 4 < 5, 5 < 5 -> break. Four runs
    System.out.println(i); //Outputs 1, 2, 3, 4 (not 5) 
}

相比:

int i = 0;
while(i++ < 5) {           //Checks 0 < 5, 1 < 5, 2 < 5, 3 < 5, 4 < 5, 5 < 5 -> break. Five runs
    System.out.println(i); //Outputs 1, 2, 3, 4, 5
}
于 2012-07-24T10:48:13.197 回答
4

要知道的事情:
1. Java 从左到右计算表达式
2. ++i-pre-increment 即在赋值前递增
3. i++ - post -increment 即在赋值后递增

System.out.println(i++ + i++);

op1=i++
op2=1++
sum=op1+op2
i++ - 后递增 i 的值

  1. 将 i 分配给 op1,然后增加 i.op1=1,i=2 的值
  2. 将 i 分配给 op2,然后增加 i.op2=2,i=3 的值
  3. 总和=3

    System.out.println(++j + ++j);

op1=++j
op2=++j
sum=op1+op2
++i - 预增加 i 的值

  1. 现在首先 j 将递增到 2,然后分配给 op1。
  2. 然后,j 将再次递增到 3 并分配给 op2
  3. 然后,将 op1 和 op2 相加以将总和打印为 5,j 的值将是

    System.out.println(k++ + ++k);

op1=k++
op2=++k
sum=op1+op2

  1. 将 k 的值赋给 op1,然后增加 k。op1=1,k=2

  2. 增加 k 的值,然后分配给 op2。op2=3,k=3

  3. 总和 = 4

    System.out.println(++l + l++);

在这里也应用上述逻辑。

于 2012-07-24T11:00:45.843 回答
1

顾名思义,后增量会在变量已处理(读取)之后递增变量的值,而前增量会在变量之前递增值。

对于 i,这意味着首先 i 递增 1,但读取为 1,然后再次递增 1(从第一个递增开始现在已经是 2),因此递增到 3,但读取为 2。这导致 1+2 = 3 并且 i 的值也将是 3...

于 2012-07-24T10:49:15.320 回答
1
i++ + i++

表示使用 i,然后递增,所以 i 被推入某种堆栈,

然后增加 1,

然后运算符 (+) 被压入堆栈,

然后 i(现在为 2)被推入堆栈。

由于表达式现在结束了,值和运算符被弹出:第二个 i 是 2,第一个 i 是 1,2+1=3(i 现在是 3,因为它在被推送后递增)。

您可能缺少的事情是 i 在整个表达式的评估后不会增加,在后增量的情况下,反之亦然。

于 2012-07-24T10:50:46.050 回答
1

System.out.println(i++)

-> 产生 1,因为它在打印后递增,但是当调用它两次时,你将得到 1 + 2,所以你可以将它翻译成

System.out.println(int i=i+1, plus int i = i + 1 -> 这给出 2)

第一个短语给出 2 和第二个给出 3 但你在 i++ 递增之前打印它,所以你最后会有 1 + 2

System.out.println(++j);

-> 产生 2,因为它在打印前递增

所以当你有 ++j = 2 然后 ++j = 3 所以 ++j 和 ++j 现在是 5

于 2012-07-24T10:58:59.967 回答