2016-01-07 27 views
1

在上Definite Assignment在Java語言規範一章中,Example 16-2爲什麼Java語言規範說表達式(n> 2)不是一個常量表達式?

Java編譯器必須產生一個編譯時錯誤代碼:

{ 
    int k; 
    int n = 5; 
    if (n > 2) 
     k = 3; 
    System.out.println(k); /* k is not "definitely assigned" 
           before this statement */ 
} 

即使n的值是已知在編譯時,並且原則上 在編譯時可以知道對k的賦值總是會被​​執行(更適當地,被評估) 。根據本節中規定的規則,Java編譯器必須運行 。規則只識別 常量表達式;在此示例中,表達式n> 2是 不是第15.28節中定義的常量表達式。

但是,如果我們看§15.28,它說,

關係運算符<,< =,>和> =

有助於常量表達式。

表達式n > 2是否爲常量表達式?我們如何確定這一點?

+5

'n'是一個常量表達式嗎?不。 – Tunaki

回答

10

這樣說是因爲n不是constant expression

常量表達式是表示原始 類型的值或String不突然完成並僅使用 由以下的表達式:

常量變量是與一個常量表達式(§15.28)初始化基本類型或類型 Stringfinal變量。

n不是final因此不是一個常量變量。因此它不是一個常量表達。因此n < 2不是一個常量表達式。

+0

因此,局部變量名稱不是一個常量變量,我錯過了簡單名稱部分。現在我明白了,thot Sotirios! – reinardhz

+0

@reinardhz不,你誤解了。問題不在於名稱,而是變量不是「最終」的事實。 –

+0

那麼,任何不是最終的變量都不是一個常量變量吧? – reinardhz

1

您誤解了規範的§15.28。該部分列出了常數表達式中允許的語言元素。如果表達式列表上有任何而不是,那麼它不是一個常量表達式。它確實是而不是的意思(正如你明顯的讀到的那樣),如果列表中的任何元素都存在,那麼表達式是恆定的。

從語言規範(強調):

常量表達式是表示原語類型的值或一個String不突然完成和表達使用由下列:
...等

表達n > 2不是一個常量表達式,因爲n未宣佈爲final,因此n不是常數。即使它在代碼中的那個值只能是5,也不符合常量的語言定義。 (見§4.12.4,參考§15.28。)