Java ++(新整数(100))//错误

Java ++(新整数(100))//错误,java,Java,有人能告诉我为什么这里出现编译器错误吗 class NewInteger{ public static void main(String[] args){ Integer i = new Integer(200); Integer j = ++i; //ok Integer k = ++(new Integer(300)); //compile error: unexpected type

有人能告诉我为什么这里出现编译器错误吗

class NewInteger{
  public static void main(String[] args){
    Integer i = new Integer(200);
    Integer j = ++i;                    //ok
    Integer k = ++(new Integer(300));   //compile error: unexpected type
                                        //               required: variable
                                        //               found: value
  }
}
在我看来,有问题的行只是前面两行的一个更简洁的版本。

读取变量,增加读取的值,然后写回变量。新整数300不是变量,不能写入

这就是两个示例之间的关键区别:在j=++i的情况下,++有一些东西可以写回i。在第二种情况下,情况并非如此

这里使用变量的方式与JLS经常使用的方式相同(尽管奇怪的是并不总是如此),这意味着本地变量和实例或类字段。

读取变量,增加读取的值,然后写回变量。新整数300不是变量,不能写入

这就是两个示例之间的关键区别:在j=++i的情况下,++有一些东西可以写回i。在第二种情况下,情况并非如此

这里使用变量的方式与JLS经常使用的方式相同(尽管奇怪的是并不总是如此),这意味着本地变量和实例或类字段

在我看来,这句冒犯性的话只是前面两句话的简洁版本

事实并非如此。这两种语言中的++及其前缀和后缀版本对其操作数都有副作用,这要求操作数是一个变量,而不仅仅是某个表达式。忽略前缀/后缀的区别

Integer j = ++i;
实际上有点像

Integer j = (i += 1);  // Note the side-effect on i
在精神上

要查看副作用的发生,请尝试在第二行之前打印i的值,即

System.out.println(i);
Integer j = ++i;
System.out.println(i);
并观察打印的值是否不同

在我看来,这句冒犯性的话只是前面两句话的简洁版本

事实并非如此。这两种语言中的++及其前缀和后缀版本对其操作数都有副作用,这要求操作数是一个变量,而不仅仅是某个表达式。忽略前缀/后缀的区别

Integer j = ++i;
实际上有点像

Integer j = (i += 1);  // Note the side-effect on i
在精神上

要查看副作用的发生,请尝试在第二行之前打印i的值,即

System.out.println(i);
Integer j = ++i;
System.out.println(i);

注意,打印的值是不同的。

在类似于Java的C语言中,有两种类型的表达式:左值和右值。左值可以出现在赋值表达式的任一侧,右值只能出现在右侧。通常,左值是变量的名称,这意味着它们在内存中有一个特定的位置来支持它们。这是有意义的,因为当您执行赋值时,左侧的表达式需要有一个存储结果的位置。例如,表达式a是一个变量的名称,因此它可以是一个左值。但a+1只是计算一个临时结果,因此如果将其用作分配位置,则无处存储该值


++运算符需要一个左值,因为除了向表达式添加左值外,它还试图将结果存储在递增的变量中。在第一个示例中,这是有效的,因为i是一个左值,它可以将计算结果存储在变量的内存中。在第二个示例中,新整数300是一个右值,因为它只是一个临时计算,没有存储结果的位置。因此,它不能与++运算符一起使用。

在类似于Java的C语言中,有两种类型的表达式:左值和右值。左值可以出现在赋值表达式的任一侧,右值只能出现在右侧。通常,左值是变量的名称,这意味着它们在内存中有一个特定的位置来支持它们。这是有意义的,因为当您执行赋值时,左侧的表达式需要有一个存储结果的位置。例如,表达式a是一个变量的名称,因此它可以是一个左值。但a+1只是计算一个临时结果,因此如果将其用作分配位置,则无处存储该值


++运算符需要一个左值,因为除了向表达式添加左值外,它还试图将结果存储在递增的变量中。在第一个示例中,这是有效的,因为i是一个左值,它可以将计算结果存储在变量的内存中。在第二个示例中,新整数300是一个右值,因为它只是一个临时计算,没有存储结果的位置。因此,它不能与++运算符一起使用。

只能递增变量。 第一个案件

Integer j = ++i;
您已递增一个变量并将其分配给整数类型j

在第二种情况下,您希望增加一个类整数,这是不可能的

 Integer k = ++(new Integer(300));

只能递增变量。 第一个案件

Integer j = ++i;
您已递增一个变量并将其分配给整数类型j

在第二种情况下,您希望增加一个类整数,这是不可能的

 Integer k = ++(new Integer(300));
密切相关