Pin*_*juh 16 java syntax operators
为什么以下语法正确:
x = y+++y;
Run Code Online (Sandbox Code Playgroud)
它意味着什么
y++ + y或y + ++y意味着什么y * 2 + 1(不确定这一点,但是:非常含糊不清)
但是这种语法不正确:
x = y+++++y;
Run Code Online (Sandbox Code Playgroud)
这应该意味着
y++ + ++y,这意味着什么y * 2 + 2
这种语法的错误是否有原因?(编辑:谢谢你解释为什么它是无效的语法,但这不是我对这个问题的意图.)
(编辑:当然我没有在真正的代码中使用它,纯粹是为了解析器/词法分析器;但我想知道为什么解析器不喜欢这个;最后一个例子看起来比第一个看起来更不明确.)
(编辑:
int i = 0;
int j = (i = 3)+++i;
Run Code Online (Sandbox Code Playgroud)
也是无效的,虽然它对我来说似乎非常明确,(i = 3)是一个值,因此(值+值)然后是++i值令牌.)
nos*_*nos 20
解析是贪婪的,也就是说,它首先寻找最长的匹配令牌.这大大简化了实现(大概).另外,Java语言规范(3.2)说:
Java总是在每一步使用尽可能长的翻译,即使结果最终没有生成正确的Java程序,而另一个词汇翻译会
因此,对于y+++++y;解析器/标记器将分解如下:
y++(因为没有+++运算符,++是最符合java语法的)++(因为没有+++运算符,++是最符合java语法的)+ (这是第一个与语法匹配的东西)y实际上,它是(y++) (++) (+y)
在++为变量定义运算符时解析的,但第一个表达式(y++)返回一个值.您不能将下一个operator(++)应用于值.
这意味着x = y+++y;将被解析为y++ + y,这没有任何问题.
Syn*_*tic 10
简而言之,由于Java表达式的计算顺序,解析器认为您正在尝试在表达式上使用++运算符,这是非法的.
我认为这个:
x = y+++++y;
Run Code Online (Sandbox Code Playgroud)
正在被解析为这样的事情:
x = ((y++)++) + y);
Run Code Online (Sandbox Code Playgroud)
或类似的东西:
x = (y + (++(++y)));
Run Code Online (Sandbox Code Playgroud)
我会假设这只是一个学术问题,而你实际上并没有尝试在现实世界中使用这样的代码.不间隔操作员只会导致痛苦和痛苦.
Java语言规范列出了此处评估表达式的所有规则.