为什么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来存放0和getInt()都不是的增量操作的结果。
前置操作符和后置操作符仅在被调用时对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式。