运算符优先级问题导致“错误:意外类型”

时间:2013-07-24 15:13:43

标签: java

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

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

这给出了:

Error: unexpected type

required: variable
found: value

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

我的问题是双重的:

  1. 为什么会出现这个错误?这究竟是什么意思?
  2. 为什么postfix的优先级高于prefix?我确信这是有充分理由的,但我无法想出一个。也许它会解决这个未定义的行为,但它会以某种方式引起更多问题?

4 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:4)

尝试

int y = 2++;

你会得到同样的错误。 Post / pre运算符应用于变量而不是某个数字。这就是为什么会出现错误

 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

答案 2 :(得分:2)

x本身是一个变量,可以修改,因此您可以++xx++

但是当您执行--x++时,--会应用x++,这是不可修改的,因为它是值而不是变量。

答案 3 :(得分:2)

从技术上讲,表达式中的某个实体要么是“lval”,要么是“rval”。 “lval”是一个“左手值”(在x = y的左侧)并且可以分配给。 “rval”是“右手值”,无法分配。您可以使用“lval”来调用“rval”,但反之亦然。 ++--需要“lvals”。

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