[英]Why doesn't the post increment operator work on a method that returns an 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;
区别= 0 + 1;
?
操作的参数无效++ / -
i++
是对变量i
的赋值。
在您的情况下, zero++
相当于zero = zero + 1
。 所以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值中的L代表赋值运算符的左侧 (即=
),即使可以在赋值运算符的左侧或右侧找到L值(例如x = y
)。
相反的是R值 ( R代表赋值运算符的右侧 )。 R值只能在赋值语句的右侧使用,以便为L值赋值。 通常,R值是文字(数字,字符串......)和方法。
因为如JLS所述 :
后缀表达式的结果必须是可转换(§5.1.8)到数字类型的类型的变量,否则会发生编译时错误。
getInt()
不是int
getInt()
返回int
++
运算符做两件事increment
+ assignment
因此,对于++
运算符来说,需要一个变量来存储增量运算的结果,其中0
和getInt()
都不是。
前置和后置运算符仅在调用变量或左值时运行。 左值是左值的缩写,即在赋值中可以站在左边的东西。 在你的例子中:
zero = 1; // OK
0 = 1; // Meaningless
getInt() = 1; // Also meaningless
// JK
B和C都让编译器说:
意外类型,必需:变量,找到:值
所以你不能增加一个值,只能增加一个变量。
为什么post增量运算符不能处理返回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!
0 ++
相当于0 = 0 + 1;
当然这是不可能的。
即它必须是l-value
才能分配给它。
getInt()++;
类似的原因在这里
因为0
是一个rValue
(即你只能从赋值运算符的右边使用它) not a lValue
。
++
运算符递增该值并将其设置为自身,因此0++
将给您一个错误。
我的回答是“开箱即用”。
当我对运算符的使用有疑问时,我认为这个运算符的“它的重载函数等价于哪个”?
我知道,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()++”这样的函数结果不是变量引用。
干杯。
postincrement和preincrement只能在变量的帮助下应用。所以第一个案例编译。
由于函数返回是RHS表达式,因此前/后递增/递减操作只能应用于LHS表达式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.