java-为什么后增量运算符不能在返回int的方法上工作?
public void increment(){
int zero = 0;
int oneA = zero++; // Compiles
int oneB = 0++; // Doesn't compile
int oneC = getInt()++; // Doesn't compile
}
private int getInt(){
return 0;
}
它们都是int的,为什么B&C不能编译? 与++运算符与= 0 + 1;运算符不同的方式有关吗?
无效的操作参数++ /-
11个解决方案
146 votes
=是对变量x = y的赋值。
在您的情况下,=与x = y等效。因此0++表示0 = 0 + 1,以及getInt() = getInt() + 1,这都没有意义。
更精确地 :
int oneA = zero++;
手段
int oneA = zero;
zero = zero + 1; // OK, oneA == 0, zero == 1
int oneB = 0++;
手段
int oneB = 0;
0 = 0 + 1; // wrong, can't assign value to a value.
int oneC = getInt()++;
手段
int oneC = getInt();
getInt() = getInt() + 1; // wrong, can't assign value to a method return value.
从更一般的角度来看,变量是L值,表示它是指内存位置,因此可以分配。 即使可以在赋值运算符的左侧或右侧找到L值(例如x = y),L值中的L也代表赋值运算符的左侧(即=)。
相反的是R值(R代表赋值运算符的右侧)。 R值只能在赋值语句的右侧使用,以将某物分配给L值。 通常,R值是文字(数字,字符串...)和方法。
xlecoustillier answered 2019-10-07T23:41:50Z
29 votes
因为如JLS中所述:
后缀表达式的结果必须是以下类型的变量: 可转换(第5.1.8节)为数字类型或编译时错误 发生。
PermGenError answered 2019-10-07T23:42:22Z
14 votes
++不是0
++返回0
++操作员执行两项操作0 + getInt()
因此,对于++运算符而言,您需要一个变量来存储增量运算的结果,而0和getInt()都不是。
Apurv answered 2019-10-07T23:43:09Z
10 votes
前置运算符和后置运算符仅在变量或左值被调用时进行操作。 左值是左值的缩写,即在赋值中可以站立在左边的东西。在您的示例中:
zero = 1; // OK
0 = 1; // Meaningless
getInt() = 1; // Also meaningless
//jk
j.karlsson answered 2019-10-07T23:43:41Z
5 votes
B和C都使编译器说:
意外类型,必需:变量,找到:值
因此,您不能递增值,只能变量。
answered 2019-10-07T23:44:21Z
4 votes
为什么后递增运算符不能在返回int的方法上使用?
因为它是一种getter方法,所以通过getter更改值没有意义。
int z = x + y++;
相当于:
int z = x + y;
y = y + 1;
因此,具有以下内容是无效的:
int z = x + getY()++;
等效于:
int z = x + getY();
getY() = getY() + 1; // invalid!
Eng.Fouad answered 2019-10-07T23:45:03Z
3 votes
0 ++
它等效于l-value,当然不可能。
即必须分配给l-value。
getInt()++;
类似的原因在这里。
Azodious answered 2019-10-07T23:45:56Z
2 votes
因为++是rValue(即,您只能从赋值运算符的右边使用它)not a lValue。
++运算符会递增该值并将其设置为自身,因此0++将给您一个错误。
Arsen Alexanyan answered 2019-10-07T23:46:30Z
0 votes
后增量和前增量只能在变量的帮助下应用。
Gijo answered 2019-10-07T23:46:57Z
0 votes
我的回答是“开箱即用”。
当我对运算符的用法有疑问时,我认为该运算符的“哪个与重载函数等效”?
我知道Java运算符没有运算符重载,这只是解决方案的另一种方法。
在这种情况下:
...
x++;
...
应理解为:
...
int /* function */ postincrement (/* ref */ int avalue)
{
int Result = avalue;
// reference value,
avalue = avalue + 1;
return Result;
}
...
postincrement(/* ref */ x);
...
和:
...
++x;
...
...
int /* function */ preincrement (/* ref */ int avalue)
{
// reference value,
avalue = avalue + 1;
int Result = avalue;
return Result;
}
...
preincrement(/* ref */ x);
...
因此,“ ++”的两个版本都可以作为通过引用接收变量参数的函数。
因此,像“ 0 ++”这样的文字值或像“ getInt()++”这样的函数结果都不是变量引用。
干杯。
umlcat answered 2019-10-07T23:48:03Z
0 votes
由于函数返回是RHS表达式,因此前/后递增/递减运算只能应用于LHS表达式。
Gaurav Phapale answered 2019-10-07T23:48:30Z