8

由于最近有很多运算符优先级问题,我开始玩一些代码并想出了这个:

int x = someNumber;
int y = --x++;

这给出了:

Error: unexpected type

required: variable
found: value

我尝试这样做是因为我有兴趣了解 java 如何处理postfix运算符优先级高于prefix. 这似乎上面的陈述会导致矛盾,我猜这是由这个错误处理的。

我的问题有两个:

  1. 为什么会出现这个错误?这到底是什么意思?
  2. 为什么postfix的优先级高于prefix?我敢肯定这是有充分理由的,但我一直无法想出一个。也许它会修复这种未定义的行为,但它会以某种方式引发更多问题?
4

4 回答 4

12

错误的原因是x++产生了一个值,并且您不能将减量运算符应用于一个值,而只能应用于一个变量。例如,如果 x=41,x++计算结果为 41,而不是变量 x,并且--(41)没有意义。

至于为什么后缀的优先级高于前缀,我的猜测是为了避免在解析时与其他运算符产生歧义。例如,编译器可以报告语法错误,x--x而不是将其解析为x-(-x).

于 2013-07-24T15:18:13.617 回答
4

尝试

int y = 2++;

你会得到同样的错误。后/前运算符应用于变量而不是某个数字。这就是你得到错误的原因

 Error: unexpected type

因为它需要一个变量而不是某个数字。假设你的号码是 3

 int x = 3;
 int y = --x++;

int y become 2++ after applying -- operator on java (as java operator works 
from left   to  right)

我不知道您在第二个问题中到底想问什么。但采取情景

  int y = -x---x;

这里也将从左到右操作

 (-x--)-(x) so answer will be -3 so dont get confused by postfix and prefix
于 2013-07-24T15:18:10.777 回答
2

x本身是一个变量,它是可修改的,所以你可以做++xor x++

但是当你这样做时--x++, then--将应用于x++,这是不可修改的,因为它是一个值而不是变量。

于 2013-07-24T15:18:30.953 回答
2

从技术上讲,表达式中的某些实体是“lval”或“rval”。“lval”是一个“左值”(在 的左侧x = y),可以赋值给。“rval”是“右手值”,不能赋值。您可以在需要“rval”的地方使用“lval”,但反之则不行。 ++--需要“lvals”。

“lval”可以是一个简单的变量名,或者一个取消引用的指针,或者一个数组索引表达式(可能还有 2-3 个其他)。

于 2013-07-24T16:13:08.900 回答