【问题标题】:One plus plus two compiles unexpectedly [duplicate]一加二编译出乎意料[重复]
【发布时间】:2015-02-21 21:16:42
【问题描述】:

所以,我希望这不会编译,它不会:

// the two is inc'd, so reduces symbolically to println(int int)
// which is a compile error
System.out.println(1 ++ 2);

但这确实:

System.out.println(1 + + 2);   // returns three

什么给了?不应该也不编译吗?

此外,由于运营商的原因,这个问题很难搜索..

【问题讨论】:

  • ++ 是一个增量运算符,因此编译器可能期望在 ++ 之前或之后有一个变量名
  • 在第二种情况下,+ 是一个“语法糖”运算符(镜像 -),它对操作数没有任何作用。
  • “另外,由于操作符的原因,这个问题很难搜索。” 为什么不搜索“Java 操作符”?您将获得一个运算符列表,并列出这些运算符。
  • @Radiodef 因此,一旦您搜索“java 运算符”,您会收到数百个与 Java 使用的数十种运算符组合无关的问题,有没有办法进一步优化搜索?
  • Analogous question in JavaC#。你可以走得更远,用1 + + + + + 2,在C as in Python

标签: java operators


【解决方案1】:

在 Java/C++/C 中,+++ + 不同。 ++/--Increment/Decrement operator。 第一种情况不起作用,因为它不适用于文字(12)。 即使那样它也不是一个有效的声明,1++ 21 ++2 在 Java 中都不是有效的声明。第二个示例有效,因为它被解释为1 + (+2)。 Java 词法分析器忽略空格。​以同样的方式这是有效的:

1 + + + 2   --> 1 + (+ (+2))

或者

1 + + + + + + + + + + + + + + + + + + + + + + + + + + + 2

​它之所以有效,只是因为 +unary 运算符。它不适用于以下字符串:

"a" + + "b"   // does not work because +"b" is not valid.

同样对乘法无效

1 * * 2       // does not work because *2 is not valid.

【讨论】:

  • 说词法分析器忽略空格不太正确,是吗?毕竟,它不会将1++2 解释为int biplus unplus int,也不会将1+ +2 解释为int incr int
【解决方案2】:

消息是:

Main.java:14: error: ')' expected
        System.out.println(1 ++ 2);
                               ^

1 ++ 2 语句被解析为 1 后跟 ++ 后跟 2。这被解释为 1++2 创建语法错误(而不是 unexpected type 错误;事实上,如果您使用变量,例如 i ++ j,您将得到相同的错误)。


另一方面,1 + + 2 语句被解析为1,然后是+,然后是+2,它可以按预期编译。两个运算符之间的空格将两个运算符分开。

【讨论】:

    【解决方案3】:

    有时使用变量更容易发现问题。

    你的 sn-p 可以改写为:

    int a = 1;
    int b = +2;
    System.out.println(a + b); 
    

    现在,您可以很容易地看到第二个+ 运算符用于指示正​​值。 你也可以写+1 + +2

    - 运算符可用于否定表达式。

    +- 是一元运算符。

    【讨论】:

      【解决方案4】:

      Java 将工作中的 1 + + 2 解释为 1 加正 2。请参阅 Unary operator section

      【讨论】:

      • 虽然没有其他正确答案那么详细,但解析和理解的速度相当快。
      • 有时不需要详细的规范分解。有时,最好的答案是最简单的答案。 :)
      【解决方案5】:

      来自规范,Lexical Translations

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

      (也称为maximal munch。)

      ++ 被解释为不能应用于整数文字的postfix increment operator,因此编译器错误。

      虽然

      1 + + 2
      

      每个字符都被单独解释。 1 是整数文字,+additive operator+unary plus operator2 是整数文字。整个表达式等价于

      1 + (+2)
      

      这样更容易阅读。

      【讨论】:

        猜你喜欢
        • 2020-01-12
        • 2015-03-01
        • 2014-09-11
        • 2013-07-15
        • 1970-01-01
        • 1970-01-01
        • 2019-05-14
        • 2014-10-02
        • 1970-01-01
        相关资源
        最近更新 更多