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 :(得分:146)
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值是文字(数字,字符串......)和方法。
答案 1 :(得分:29)
因为如JLS中所述:
后缀表达式的结果必须是类型的变量 可转换(第5.1.8节)为数字类型或编译时错误 发生。
答案 2 :(得分:14)
getInt()
不是int
getInt()
返回int
++
运算符执行两项操作increment
+ assignment
因此,要使++
运算符起作用,您需要一个变量来存储增量运算的结果,0
和getInt()
都不是。
答案 3 :(得分:10)
前后运算符仅在调用变量或左值时运行。左值是左值的缩写,即在赋值中可以站在左边的东西。 在您的示例中:
zero = 1; // OK
0 = 1; // Meaningless
getInt() = 1; // Also meaningless
// JK
答案 4 :(得分:5)
B和C都让编译器说:
意外类型,必需:变量,找到:值
所以你不能增加一个值,只能增加一个变量。
答案 5 :(得分:4)
为什么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!
答案 6 :(得分:3)
0 ++
相当于0 = 0 + 1;
,当然不可能。
即。它必须l-value
才能分配给它。
getInt()++;
这里有类似的原因。
答案 7 :(得分:2)
因为0
是rValue
(即您只能从赋值运算符的右侧使用它)not a lValue
。
++
运算符会递增值并将其设置为自身,因此0++
会给您一个错误。
答案 8 :(得分:0)
后增量和preincrement只能在变量的帮助下应用。所以第一个案例编译。
答案 9 :(得分:0)
我的回答是#34;开箱即用"。
当我对操作员的使用有疑问时,我认为"它的重载功能等同于#34;这个运营商?
我知道,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 ++"或者像#34; getInt()++"这样的函数结果不是变量引用。
干杯。
答案 10 :(得分:0)
由于函数返回是RHS表达式,前/后递增/递减操作只能应用于LHS表达式。