为什么post increment操作符不能返回一个inttypes的方法?

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;

操作的参数无效++ / –

i++是一个variablesi的分配。

在你的情况下, 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. 

从更一般的观点来看,variables是一个L值 ,这意味着它指的是一个内存位置,因此可以被赋值。 L值中的L代表赋值运算符(ie = )的左侧 ,即使在赋值运算符(例如x = y )的左侧或右侧也可以findL值。

相反的是R值R代表赋值运算符的右侧 )。 只能在赋值语句的右侧使用R值,将某些值赋给L值。 通常,R值是文字(数字,string…)和方法。

正如JLS所述

后缀expression式的结果必须是可以转换(§5.1.8)为数字types的types的variables,否则会发生编译时错误。

getInt()不是int

getInt()返回int

++运算符做两件事increment + assignment

所以对于++运算符来说,你需要一个variables来存放0getInt()都不是的增量操作的结果。

前置操作符和后置操作符仅在被调用时对variables或左值操作。 左值是左值的缩写,也就是左派在赋值中的东西。 在你的例子中:

  zero = 1; // OK 0 = 1; // Meaningless getInt() = 1; // Also meaningless 

// JK

B和C都让编译器说:

意外types,要求:variables,find:值

所以你不能增加一个值,只能是一个variables。

为什么post increment操作符不能返回一个inttypes的方法?

因为它是一个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++会给你一个错误。

后增量和预增量只能在variables的帮助下适用。所以第一种情况编译。

我的答案是“开箱即用”的。

当我对运营商的使用有疑问的时候,我想这个运营商的“它的重载function是否相当于”?

我知道,Java运算符没有运算符重载,它只是一个可供select的解决方法。

在这种情况下:

 ... 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()++”这样的函数结果不是variables引用。

干杯。

由于函数返回是RHSexpression式,前/后递增/递减操作只能应用于LHSexpression式。

Interesting Posts