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

Blu*_*ell 60 java post-increment

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;
}
Run Code Online (Sandbox Code Playgroud)

它们都是int的,B&C为什么不编译?是否与++运营商的不同之处有关= 0 + 1;

操作的参数无效++/ -

xle*_*ier 148

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

在你的情况下,zero++是相当于zero = zero + 1.所以0++意味着0 = 0 + 1,这没有任何意义,以及getInt() = getInt() + 1.

更精确地 :

int oneA = zero++;
Run Code Online (Sandbox Code Playgroud)

手段

int oneA = zero;
zero = zero + 1; // OK, oneA == 0, zero == 1
Run Code Online (Sandbox Code Playgroud)
int oneB = 0++;
Run Code Online (Sandbox Code Playgroud)

手段

int oneB = 0;
0 = 0 + 1; // wrong, can't assign value to a value.
Run Code Online (Sandbox Code Playgroud)
int oneC = getInt()++;
Run Code Online (Sandbox Code Playgroud)

手段

int oneC = getInt();
getInt() = getInt() + 1; // wrong, can't assign value to a method return value.
Run Code Online (Sandbox Code Playgroud)

从更一般的角度来看,变量是L值,意味着它指的是存储位置,因此可以被赋值.L值中的L代表赋值运算符的左侧(即=),即使可以在赋值运算符的左侧或右侧找到L值(x = y例如).

相反的是R值(R代表赋值运算符的右侧).R值只能在赋值语句的右侧使用,以便为L值赋值.通常,R值是文字(数字,字符串......)和方法.

  • 实际上,i = i + 1似乎等同于++ i,而不是i ++.(实际上,看到分配导致Java中的值,我感到有点震惊) (2认同)

Per*_*ror 29

因为如 JLS所述:

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


Apu*_*urv 14

getInt() 不是 int

getInt() 回报 int

++运营商做两件事increment+assignment

因此,对于++操作员来说,您需要一个变量来存储增量操作的结果,0getInt()两者都不是.


j.k*_*son 10

前置和后置运算符仅在调用变量或左值时运行.左值是左值的缩写,即在赋值中可以站在左边的东西.在你的例子中:

    zero = 1; // OK
    0 = 1; // Meaningless
    getInt() = 1; // Also meaningless
Run Code Online (Sandbox Code Playgroud)

// JK


小智 5

B和C都让编译器说:

意外类型,必需:变量,找到:值

所以你不能增加一个值,只能增加一个变量.