2012-11-22 32 views
0

我有一个问题,
Java,确实Math.min绑定比++更紧?
让我用一个例子来说明,也许有人可以向我解释为什么我会得到我得到的结果。后置操作有趣的行为()

这是我跑的方法:

private static void testIncrement() { 
    int x=10; 
    System.out.println(x++); 
    System.out.println(x); 

    x=10; 
    System.out.println("-----------"); 
    System.out.println(++x); 
    System.out.println(x); 

    x=10; 
    System.out.println("-----------\n"+x); //10 
    x=Math.min(255, x++); 
    System.out.println(x); **//x=10 WHY NOT x=11?** 

    x=10; 
    System.out.println("-----------\n"+x); 
    x=Math.min(255, ++x); 
    System.out.println(x); 
} 

的结果是:

10 
11 
----------- 
11 
11 
----------- 
10 
10 
----------- 
10 
11 

在这里我把//x=10 WHY NOT x=11?
行我不知道为什么x是10而不是11,也许有人可以向我解释这一点。

看起来好像Math.min创建了x(现在是10)的副本,它用来做Math.min。然后原始x从10增加到11,但仍然为10的副本从Math.min出来并覆盖增加的那个。

这是否有意义? 有没有人有解释为什么x是10而不是11在这种情况下?

感谢

PS - 我完全理解How do the post increment (i++) and pre increment (++i) operators work in Java?

+0

因为在将值10传递给Math.min方法后,x递增。但在分配之前。 –

回答

4

让我们解构这一行:

x = Math.min(255, x++); 

x++的意思是“记住x原始值;然后增加x,那么价值表达式是原始值“。所有这一切发生在之前。所以它相当于:

int tmp = x;    // x = 10, tmp = 10 
x = x + 1;     // x = 11, tmp = 10 
x = Math.min(255, tmp); // x = 10 

希望这应该说清楚。特别是,这与Math.min本身无关 - 它只是表现为正常的方法调用。有关更多详细信息,请参见section 15.14.2 of the JLS

+0

我同意,但为什么我的程序输出10次而不是11次。毕竟,它是在执行一个后增量。任何想法? – Adrian

+0

@Adrian:增量是在评估表达式之后,但*之前*从方法调用返回的值的赋值...因此'x'的值最终为10(这是'Math.min '返回)。阅读“扩展” - 我会添加一些评论。 –

+0

哦,我看到它,我错过了x = Math.min(255,tmp)中的温度。谢谢! :) – Adrian