【问题标题】:Java expression compilation error [duplicate]Java表达式编译错误[重复]
【发布时间】:2015-11-10 08:27:22
【问题描述】:

我想知道为什么这段代码无法编译:

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

而这段代码是这样的:

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

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

【问题讨论】:

  • x---x 和 x--- x 是有区别的。编译器应该如何知道您的意思是 x - --x 还是 x-- - x ?

标签: java expression


【解决方案1】:

x-----x 从左到右计算:

((x--)--)-x

第一个 x-- 返回 -3,您不能将 -- 运算符应用于值 (-3),只能应用于变量(例如 x)。

这就是您收到Invalid argument to operation ++/-- 错误的原因。

添加空格时 - x--- --x

评估为(x--)- (--x)

                -3 -   -5    = 2

【讨论】:

  • 它选择将x----- 评估为(x--)--)- 而不是(x--)-)-- 是否有原因?
  • 我们可以将其添加到答案中吗? :3
  • @Keale。不,因为它与运算符优先级无关。只有当我们已经知道哪些运算符出现在输入中的哪个位置时,运算符优先级才会生效,而这里是模棱两可的。
  • @Eran,请在上面的答案中添加您的评论,这很重要,值得添加!
【解决方案2】:

x-----x 被解析为(x--) -- -x,这里-- 应用于不是变量的表达式。这是不允许的。

原因如下。解析的第一阶段是对输入流进行标记:由字符组成的输入流被分组为称为标记的块。标记是对 Java 有意义的字符串,例如关键字、运算符或标识符。

标记化是贪婪:只要可以将另一个字符添加到标记中以使其仍然是有效标记,则添加该字符。因此,例如forLoop 被视为单个标识符,而不是关键字for 后跟标识符Loop

字符串--- 都是Java 中的有效标记。所以当分词器遇到--- 时,它会读取第一个字符。虽然它知道- 是一个有效令牌,但它首先查看下一个字符,并确定-- 也是一个有效令牌,因此返回的第一个令牌将是--,而不是-

【讨论】:

    【解决方案3】:

    Java 语言规范§3.2. Lexical Translations 直接涵盖了这一点

    每一步都使用尽可能长的翻译,即使结果最终不会产生正确的程序,而另一个词法翻译会。有一个例外:如果词法转换发生在类型上下文 (§4.11) 中,并且输入流有两个或多个连续的> 字符,后面跟着一个非> 字符,那么每个> 字符必须转换为数字比较运算符> 的标记。

    输入字符a--b 被标记(§3.5)为a--b,这不是任何语法正确程序的一部分,即使标记化a--b 可能是语法正确程序的一部分。

    因此,由于这不是类型上下文,也不是关于 > 字符,因此适用最长标记的规则。所以x-----x 被标记为x-----x,就像引用的例子一样。

    【讨论】:

      【解决方案4】:

      第一个例子就像减法

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

      第二个就像最小化 x -> 一样

      x++ => x=x+1
      

      你所做的是有类似的东西

      x-- => x=x-1
      

      第二部分:

      --x 
      

      首先从变量中减去 -1

      【讨论】:

      • 这不能回答问题。
      • @UmaKanth 你说得对,但经过这个解释我认为它很清楚
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 2018-09-01
      相关资源
      最近更新 更多