为什么这个java代码会编译

时间:2013-05-16 14:26:21

标签: java syntax compiler-errors

我遇到了这段代码

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是一个合法的整数值

4 个答案:

答案 0 :(得分:6)

因为“ - ”是一个monadic否定运算符,并且适用于所有数字,包括0,即使它根本不会影响0

请参阅BNF Java规则:

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

有趣的是,-0.0 0.0的数字相同

答案 1 :(得分:5)

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以符合该语言。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

可能你的意思是这样的:

private int someint;

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

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

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