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));
密切相关