我想知道为什么这段代码没有编译:
int x=-3;
System.out.println(x-----x);
这段代码确实如此:
int x=-3;
System.out.println(x--- --x);
我认为优先级是前后减量,然后应该应用减法。
答案 0 :(得分:12)
x-----x
从左到右进行评估:
((x--)--)-x
第一个x--
返回-3,您不能在值(-3)上应用--
运算符,仅在变量(例如x)上应用。
这就是导致Invalid argument to operation ++/--
错误的原因。
添加空格 - x--- --x
评估为(x--)- (--x)
-3 - -5 = 2
答案 1 :(得分:4)
x-----x
被解析为(x--) -- -x
,此处--
应用于不是变量的表达式。这是不允许的。
原因如下。解析的第一个阶段是对输入流进行标记:输入流由字符组成,按照称为标记的块进行分组。标记是对Java有意义的字符串,例如关键字,运算符或标识符。
标记是贪心:只要可以将另一个字符添加到令牌中以使其仍然是有效令牌,就会添加该字符。因此,例如forLoop
被视为单个标识符,而不是关键字for
后跟标识符Loop
。
字符串-
和--
都是Java中的有效令牌。因此,当标记化器遇到---
时,它会读取第一个字符。虽然它知道-
是有效令牌,但它首先查看下一个字符,并确定--
也是有效令牌,因此返回的第一个令牌将是--
,而不是-
。
答案 2 :(得分:4)
Java语言规范§3.2. Lexical Translations
直接涵盖了这一点每个步骤都使用尽可能长的翻译,即使结果最终没有形成正确的程序,而另一个词汇翻译也是如此。有一个例外:如果词汇翻译发生在类型上下文(§4.11)中,并且输入流有两个或多个连续的
>
个字符后跟一个非>
字符,那么必须将每个>
字符转换为数字比较运算符>
的标记。输入字符
a--b
被标记为a
,--
,b
,a
,这不是任何语法正确程序的一部分,甚至虽然标记化-
,-
,b
,>
可能是语法正确程序的一部分。
因此,由于这不是类型上下文,也不是x-----x
字符,因此适用最长令牌的规则。因此,x
被标记为--
,--
,-
,x
,Platform.runLater(() -> { friendsList.setAll(newValue); })
,与引用的示例非常相似。
答案 3 :(得分:1)
第一个例子就像一个减法
int x=-3;
System.out.println(x-----x);
第二个就像最小化x - >;和它一样
x++ => x=x+1
你所做的就是
x-- => x=x-1
和第二部分:
--x
首先从变量
中减去-1