Java表达式编译错误

时间:2015-11-10 08:27:22

标签: java expression

我想知道为什么这段代码没有编译:

 int x=-3;
    System.out.println(x-----x);

这段代码确实如此:

 int x=-3;
    System.out.println(x--- --x);

我认为优先级是前后减量,然后应该应用减法。

4 个答案:

答案 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--ba,这不是任何语法正确程序的一部分,甚至虽然标记化--b>可能是语法正确程序的一部分。

  

因此,由于这不是类型上下文,也不是x-----x字符,因此适用最长令牌的规则。因此,x被标记为-----xPlatform.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
相关问题