【问题标题】:Why does this java code compile为什么这个java代码编译
【发布时间】:2013-05-16 14:26:21
【问题描述】:

我遇到了这段代码

public class Main {
    static int someint;

    public static void main(String[] args) {
        someint = -0;
        print();
    }

    private static int print()
    {
        System.out.println(someint);
        return someint;
    }

}

当我运行它时会打印 -0

我只是好奇 -0 如何是合法的整数值

【问题讨论】:

  • 我不认为你可以编译这个。您需要将someint = -0; 括在花括号中
  • 对代码块使用一致且符合逻辑的缩进。代码的缩进是为了帮助人们理解程序流程。
  • 那你能修复你问题中的代码吗?
  • 你使用的是什么 JDK/JRE?
  • 您修改后的代码编译并打印0。你用的是什么 JRE?

标签: java syntax compiler-errors


【解决方案1】:

因为“-”是一元否定运算符,适用于包括0 在内的所有数字,即使它根本不影响0

参见BNF Java 规则:

numeric_expression  = 
 (  (  "-" 
 /  "++" 
 /  "--"  ) 
expression ) ...

有趣的是,-0.00.0 的数字不同

【讨论】:

  • @LuiggiMendoza - 我认为它回答了 OP 打算提出的问题。
【解决方案2】:

JLS #15.15.4 明确表示:

对于整数值,取反与从零减法相同。

所以int i = -0; 等价于int i = 0 - 0; 等价于int i = 0;

请注意,浮点值并非如此:

对于浮点值,取反与从零减法不同,因为如果 x 为 +0.0,则 0.0-x 为 +0.0,但 -x 为 -0.0。

因此,您的代码必须打印 0 以符合该语言。

【讨论】:

    【解决方案3】:

    减 0 就像 0 一样,编译器假设 someint = 0

    【讨论】:

      【解决方案4】:

      可能你的意思是这样的:

      private int someint;
      
      private int print()
      {
          someint = -0;
          System.out.println(someint);
          return someint;
      }
      

      为什么不应该编译它?一元运算- 对所有数字常量都有效。对于值0,它不会改变其符号。

      你的输出怎么样 - 在最新版本的 JVM (Java 1.7_17) 下它是不可重现的。它只打印出0

      【讨论】:

      • @System.Object 可能是你使用的版本有问题?
      猜你喜欢
      • 2013-03-26
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多