为什么 post increment 运算符不处理返回 int 的方法?

2022-08-31 15:44:50
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;

操作 ++/-的参数无效


答案 1

i++是对变量 的赋值。i

在您的情况下,是 等效于 .所以意味着,这毫无意义,以及.zero++zero = zero + 10++0 = 0 + 1getInt() = 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 值是文本(数字、字符串等)和方法。


答案 2

因为如JLS所述:

后缀表达式的结果必须是可转换为数值类型 (§5.1.8) 的类型变量,否则会发生编译时错误。


推荐