8

当我运行以下示例时,我得到输出 0,2,1

class ZiggyTest2{

        static int f1(int i) {  
            System.out.print(i + ",");  
            return 0;  
        } 

        public static void main(String[] args) {  
            int i = 0;  
            int j = 0;  
            j = i++;   //After this statement j=0 i=1
            j = j + f1(j);  //After this statement j=0 i=1
            i = i++ + f1(i);  //i++ means i is now 2. The call f1(2) prints 2 but returns 0 so i=2 and j=0
            System.out.println(i);  //prints 2?
        } 
    } 

我不明白为什么输出是 0,2,1 而不是 0,2,2

4

7 回答 7

5

如果我们扩展i = i++ + f1(i)语句,我们会得到如下内容

save the value of i in a temp variable, say temp1 // temp1 is 1
increment i by one (i++)                          // i gets the value 2
execute f1(i), save return value in, say temp2    // temp2 is 0, print 2
assign temp1 + temp2 to i                         // i becomes 1 again

我想主要步骤可以总结如下。

于 2011-12-23T11:59:30.457 回答
3
 i = i++ + f1(i);  

i++意思i是现在2。调用f1(i)打印2但返回 0 所以i=2j=0

在此之前i = 1,现在想象f1()调用并替换为 0

所以

i = i++ + 0;

现在是

i = 1 + 0 // then it will increment i to 2 and then (1 +0) would be assigned back to `i`

用简单的话来说(从这里@Piotr)

“i = i++”大致翻译为

int oldValue = i; 
i = i + 1;
i = oldValue; 

另一个这样的例子:

于 2011-12-23T11:58:18.900 回答
1

从这个例子可以理解解决方案

public static void main(String[] args) {
    int i = 0;
    i = i++;
    System.out.println("i is" + i);
}
/* The output is "i is 0" */

因此,从这条线上,

i = i++ + f1(i); 

您的 i 仍然是 1,显然该函数将返回 0。它再次存储在 i 中,因此值 1。不是将 i 的更新值存储在 i 中,而是由赋值运算符覆盖它。

于 2011-12-23T11:58:12.027 回答
1

预递增的意思是:变量加一,返回递增的值;后递增 - 首先返回 i,然后递增它;

int i, j, k;
i = 0; // 0
j = i++; // return i , then increment i
// j = 0; i = 1;
k = ++i; // first increment and return i
//k = 2; i = 2;

// now
++j == --k == --i // would be true => 1==1==1;
// but , using post increment would 
// j++ == k-- == i-- // false because => 0 == 2 == 2;
// but after that statement j will be 1, k = 1, i = 1;
于 2011-12-23T12:09:52.380 回答
1

希望这个解释可能会有所帮助:

j = i++; // Here since i is post incremented, so first i being 0 is assigned to j
         // and after that assignment , i is incremented by 1 so i = 1 and j = 0.

i = i++ + f1(i); // here again since i is post incremented, it means, the initial value 
                 // of i i.e. 1 as in step shown above is used first to solve the 
                 // expression i = i(which is 1) + f1(1)**Since i is 1**
                 // after this step the value of i is incremented. so i now becomes 2
                 // which gets displayed in your last System.out.println(i) statement.   

试试这个

i = ++i + f1(i); // here i will be first inremented and then that value will be used 
                 // to solve the expression i = i + f1(i)'

所以简而言之,在后递增期间,首先求解表达式,然后递增值。但是在预增量中,首先增加值,然后求解表达式。

但如果你只写

i++;
++i;

那么两者的意思是一样的。

问候

于 2011-12-23T12:11:27.617 回答
1

在 Post increment 运算符中,操作数的值将在使用后增加。 例子

int k =1;
        int l = k++;
        System.out.println("...k..."+k+"...l.."+l);

首先 k (value = 1) 被赋值为 l 之后 k 值将增加

同样的事情发生在以下行

i = i++ + f1(i);
于 2011-12-23T12:11:47.357 回答
1

要深入了解,您需要查看表达式及其评估顺序

这是关于方程i++ + f1(i)评估的一点解释

在 Equation Compiler 中,获取等于1的"i"并将其作为第一个操作数放入堆栈,然后递增"i",因此其值为2,并通过调用函数计算第二个操作数,该函数将为0并在操作时(+)执行操作数将是10

于 2011-12-23T12:44:48.470 回答