在JSF中开发Web应用程序时,我遇到了一个以我无法遵循的方式进行评估的表达式。让我们用简单的Java代码表示相同的表达式。
final public class Main
{
public static void main(String[] args)
{
int x=5;
int temp=10;
temp=temp + 1 + x;
System.out.println("temp = "+temp);
int var=10;
var=var++ + x;
System.out.println("var = "+var);
}
}
在上面的简单代码段中,第一种情况很明显,它通过语句System.out.println("temp = "+temp);
显示值 16 。毫无疑问,但在第二种情况下,我使用简写运算符 ++ (var ++)表示相同的事情,并导致值 15 显示在控制台上,而不是显示 16 。这个表达式在这里如何评估?
这里有一个显而易见的事情应该提到。在表达式var ++中,首先传递10,并且该值(不是11)用于计算赋值右侧的整个表达式,在本例中为 var ++ + x ,然后是 var 增加1.因此,此处无法观察到自身(var)的分配。 增量丢失在哪里?
答案 0 :(得分:4)
var++
计算到var,然后递增var
。所以你的表达式实际上被评估为var + x
。
行动顺序如下:
任何这样的编程应该被禁止开发,恕我直言。
答案 1 :(得分:3)
像x ++这样的后增量运算符意味着首先使用值x然后增加,在我们的例子中
var=var++ + x;
分配优先。 试试这个
var=++var + x;
你应该得到16的值。
答案 2 :(得分:2)
您为var
分配了一个值,因此会执行自动增量但会被覆盖。
您的代码最好写成:
int var = 10;
var += x + 1;
System.out.println("var = " + var);
答案 3 :(得分:2)
根据Java语言规范
后缀增量表达式的值是存储新值之前的变量的值。
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.14.2
答案 4 :(得分:1)
这是后增量运算符的预期行为。通过运行以下内容,您可以更清楚地了解正在发生的事情:
int var = 10;
var = var++;
System.out.println("var = " + var);
var = 10;
var = var++ + var;
System.out.println("var = " + var);
这应该产生输出:
10
21
后递增运算符返回当前表达式中变量的当前值,然后递增它,因此递增的值仅在下次使用该变量时可见。
在代码中,在使用递增值之前覆盖var的值(因此递增“丢失”)。我想字节代码类似于:
// r holds the intermediate value of the expression while it's calculated
int x = 5;
int var = 10;
int r = r + var;
var = var + 1; // note var is not read after this point
r = r + x;
var = r;