簡體   English   中英

Java中的意外編譯錯誤

[英]Unexpected Compilation Error in Java

這是一個小代碼,如果輸入數組的長度是2的冪,則段數組的大小是2 *(input_array.length)-1,否則是2 *(input_array.length之后的下一個2的冪)-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語句中聲明變量,因為一旦塊結束,它就會超出范圍 所以代替:

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

您可能想要:

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

其次,您的條件被取消了; 的左手側&是一個int但右手側是boolean 按位和運算符支持兩種類型,但不一起支持; 要將boolean轉換為int您可以簡單地明確地將其轉換為int ,例如

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

要檢查input_array.length是否為2的冪,請執行以下操作:

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

請注意-1之后的額外關閉。

最后,您的語法草率,可能會使您的代碼更難使用。 盡管Java允許以多種形式聲明數組(例如, int variable[]int [] variableint[] variable ),但只有最后一種是常用的。 我強烈建議始終將數組聲明為type[] variableName ,即使您不必這樣做。 同樣,在編寫塊( ifelsefor等)時,請始終使用{ } ,因為這會使您的代碼更易於閱讀,並且將來可以更安全地進行修改。

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM