为什么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式。