Java 中的意外编译错误

Unexpected Compilation Error in Java

这是一个小代码,如果输入数组的长度是2的幂,那么段数组的大小是2*(input_array.length)-1 else 2*(next power of 2 after input_array.length)-1 .

public static int ByLogs(int n)
{
    double y = Math.floor(Math.log(n)/Math.log(2));
    return (int)Math.pow(2, y + 1);
}

public static void main(String [] args)
{
    int input_array[] = {-1,2,4,0,3};

    if(( input_array.length & (input_array.length - 1) == 0 ) && input_array.length > 0)
        int [] segment_array = new int[2*(input_array.length)-1];
    else
        int [] segment_array = new int[2*(ByLogs(input_array.length))-1];

    //Arrays.fill(segment_array,999);

    System.out.println(segment_array.length);
}

但编译后出现如下错误

SegmentTree.java:17: error: '.class' expected
        int [] segment_array = new int[2*(input_array.length)-1];
               ^
SegmentTree.java:17: error: not a statement
        int [] segment_array = new int[2*(input_array.length)-1];
            ^
SegmentTree.java:17: error: illegal start of expression
        int [] segment_array = new int[2*(input_array.length)-1];
                             ^
SegmentTree.java:17: error: ';' expected
        int [] segment_array = new int[2*(input_array.length)-1];
                              ^
SegmentTree.java:17: error: ']' expected
        int [] segment_array = new int[2*(input_array.length)-1];
                                       ^
SegmentTree.java:17: error: not a statement
        int [] segment_array = new int[2*(input_array.length)-1];
                                      ^
SegmentTree.java:17: error: illegal start of expression
        int [] segment_array = new int[2*(input_array.length)-1];
                                        ^
SegmentTree.java:17: error: ';' expected
        int [] segment_array = new int[2*(input_array.length)-1];
                                         ^
SegmentTree.java:17: error: not a statement
        int [] segment_array = new int[2*(input_array.length)-1];
                                                     ^
SegmentTree.java:17: error: ';' expected
        int [] segment_array = new int[2*(input_array.length)-1];

我找不到我的错误。

if 语句有错误。

查看评论:

public static int ByLogs(int n)

{
    double y = Math.floor(Math.log(n)/Math.log(2));
    return (int)Math.pow(2, y + 1);
}

public static void main(String[] args)
{
    int input_array[] = {-1,2,4,0,3};
    int [] segment_array;
    int n = input_array.length;

    //for positive n 
    if( (n & (n - 1)) == 0 ) {
        segment_array = new int[(2*(input_array.length))-1];
    } else {
        segment_array = new int[(2*(ByLogs(input_array.length)))-1];
    }

    //Arrays.fill(segment_array,999);

    System.out.println(segment_array.length);
}

首先,您实际上不能在这样的 if 语句中声明变量,因为它会在块结束后立即退出 scope。所以代替:

if (...) {
  int[] a = ...;
} else {
  int[] a = ...;
}

你可能想要:

int[] a; // declare the variable first, *then* initialize it
if (...) {
  a = ...;
} else {
  a = ...;
}

其次,你的条件被破坏了; & 的左侧是 int,而右侧是 boolean。按位与运算符支持这两种类型,但不能一起使用;到 convert a boolean to an int 你可以简单地明确地这样做,例如

((input_array.length - 1) == 0) ? 1 : 0

检查是否input_array.length is a power of two你想要:

(input_array.length & (input_array.length - 1)) == 0

注意 -1.

之后的额外闭括号

最后,您的语法很草率,这可能会使您的代码更难使用。尽管 Java 允许以多种形式声明数组(例如 int variable[]int [] variableint[] variable),但只有最后一种形式是常用的。我强烈建议始终将您的数组声明为 type[] variableName,即使您不必这样做。同样,在编写块(ifelsefor 等)时始终使用 { },因为它使您的代码更易于阅读,并且将来修改起来更安全。