由于最近有很多运算符优先级问题,我开始使用一些代码并提出了这个问题:
int x = someNumber;
int y = --x++;
这给出了:
Error: unexpected type
required: variable
found: value
我试过这个是因为我有兴趣了解java如何处理postfix
的运算符优先级高于prefix
的事实。这似乎上面的陈述会导致矛盾,我猜这是由这个错误处理的。
我的问题是双重的:
postfix
的优先级高于prefix
?我确信这是有充分理由的,但我无法想出一个。也许它会解决这个未定义的行为,但它会以某种方式引起更多问题?答案 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
本身是一个变量,可以修改,因此您可以++x
或x++
。
但是当您执行--x++
时,--
会应用x++
,这是不可修改的,因为它是值而不是变量。
答案 3 :(得分:2)
从技术上讲,表达式中的某个实体要么是“lval”,要么是“rval”。 “lval”是一个“左手值”(在x = y
的左侧)并且可以分配给。 “rval”是“右手值”,无法分配。您可以使用“lval”来调用“rval”,但反之亦然。 ++
和--
需要“lvals”。
“lval”可以是一个简单的变量名,一个解除引用的指针,一个数组索引表达式(可能还有2-3个其他)。