Java 为什么我不能增加返回值?
我注意到令人惊讶的行为: 我可以这样写:Java 为什么我不能增加返回值?,java,return-value,increment,Java,Return Value,Increment,我注意到令人惊讶的行为: 我可以这样写: Integer integer = 0; integer++; getInteger()++; 但是我不能这样写: Integer integer = 0; integer++; getInteger()++; 如果 对我来说,两个片段看起来是一样的 但第二段代码会产生: unexpected type getInteger()++; ^ required: variable found
Integer integer = 0;
integer++;
getInteger()++;
但是我不能这样写:
Integer integer = 0;
integer++;
getInteger()++;
如果
对我来说,两个片段看起来是一样的
但第二段代码会产生:
unexpected type
getInteger()++;
^
required: variable
found: value
为什么禁止二次施工
在代码中,我经常被迫写这样难看的结构:
obj.set(obj.get()+1);
它看起来冗余。
x++
与x+1
不同。它是x+=1
的缩写,即x=x+1
;递增,然后分配。所以getInteger()++
意味着getInteger()=getInteger()+1
,这毫无意义。您正在向值中添加一个,而不是增加变量
除此之外,++
对int
有效,但对整数不起作用,但即使返回int
,也不能用++
递增:
class Test {
static public void main() {
getint()++;
}
static int getint() {
int a = 0;
return a;
}
}
给予
<>(在C++中,你可以用引用来完成这项工作,但是java没有这些。) 你没有返回<代码> int <代码>,你返回了<代码>整数< /Cord>对象。Integer
类是不可变的,并且没有自己的++
运算符
此外,++
运算符要求其操作数为左值
,即可赋值变量,而不是值
。getInteger()
的结果是后者
对于您的第一次测试:
Integer integer = 0; integer++;
Java的自动装箱允许使用++
运算符,但这只是因为Java会自动将整数
转换为整数
,然后再转换回来,而且变量整数
是左值
。这或多或少相当于:
int tmp_int = integer.intValue();
int result = tmp_int++;
integer = Integer.getInteger(tmp_int);
(void)result;
result
-表达式的有效“值”不是integer
,因为您使用了++
的“增量后”版本,因此结果是integer
在递增之前的值
为什么禁止二次施工
Integer
是不可变的,因此您无论如何都无法更改它int
是可变的,但由于它只返回值的副本,因此也不起作用
e、 g
obj.set(obj.get()+1)
这也破坏了封装。我建议这样的方法
AtomicInteger i = new AtomicInteger(0);
i.incrementAndGet();
或者你也可以有自己的
i.incr();
8++没有意义,但是
int x=8;
x++;
有道理吗
因为x++的工作方式类似于x+=1
,即x=x+1
而且8=8+1
是不可接受的。正如它所说,它需要+
运算符的变量<代码>++
增加存储在某个位置的值,因此增加的值现在存储在该位置。函数只返回一个值,该值不是变量
正如拉胡尔在评论中提到的那样简单
//This works
x=5;
x++; //Now x=6 since x++ is equivalent to x=x+1;
//This doesn't work
5++; //this doesn't even make sense, trying to do 5=5+1??
//similarly, getNumber() is just a value that is returned, it is a value, not a variable
//So it is like the second case
//This doesn't work
getNumber()++; //Trying to do getNumber()=getNumber()+1; ??
不能执行常量++即5++。在您的方法中,您返回0;obj.get()+1和obj.get()+1有多大区别?您希望它做什么?转换为调用
setInteger(getInteger()+1)
?别忘了Java语言对getter和setter一无所知…@Alnitak Integer不知道,但Java 5.0+支持装箱。@PeterLawrey fair point about boxing-可能编译器无法在getInteger()中装箱++
scenarioETOOMANYLANGUAGESINMYHEAD
未为类型定义运算符++
Integer@Zhuinden这是我最初的观点,但正如彼得所指出的,使用自动拳击是可能的。真正的问题很简单,函数的结果是一个值,而不是左值
//This works
x=5;
x++; //Now x=6 since x++ is equivalent to x=x+1;
//This doesn't work
5++; //this doesn't even make sense, trying to do 5=5+1??
//similarly, getNumber() is just a value that is returned, it is a value, not a variable
//So it is like the second case
//This doesn't work
getNumber()++; //Trying to do getNumber()=getNumber()+1; ??