天天看點

《Java 7程式設計入門經典》一2.15 表達式

運算符、變量和字面量都是表達式(expression)的組成部分。當在程式中遇到表達式時,會計算該表達式。因為它在前面的程式中已經用過,是以讀者可能對表達式已有相當的直覺了解。另外,java的表達式也與代數中的表達式類似。但是,現在還是要讨論表達式的一些方面。

在表達式中,可能将兩種或多種不同類型但互相相容的資料混合。例如,因為short類型和long類型都是數值類型,是以在表達式中将它們混合使用。當一個表達式中混合不同種類的資料,它們會轉換為同一類型。這是通過java的類型提升規則(type promotion rule)來完成的。

首先,所有的char值、byte值、short值都提升為int類型。其次,當一個操作數是long類型時,整個表達式提升為long類型。如果一個操作數是float類型的操作數,整個表達式提升為float類型。如果有任何操作數是double類型,結果是double類型。

類型提升隻使用于在計算表達式中遇到的值,了解這一點很重要。例如,在表達式内byte類型提升為int類型,但在表達式外變量仍然為byte類型。類型提升隻影響表達式的計算。

但是,類型提升會導緻不希望的結果。例如,當一個算術運算與兩個byte值有關時,下列情況發生:首先,将byte類型的操作數提升為int類型。當操作發生時,生成int類型的結果。于是,對兩個byte值進行運算的結果是int型。這與直覺感覺不同。考慮以下程式:

《Java 7程式設計入門經典》一2.15 表達式

與直覺感受相反,當把bb賦給變量i時,不需要強制類型轉換,因為在計算表達式時,變量b已經提升為int類型。但是,如果将bb賦給b,需要使用強制類型轉換将類型變回byte類型。記住,如果獲得了與期望不同的類型,在表達式上會有提示不相容的錯誤消息。否則,一切就都好。

同樣的情況在執行與char類型有關的操作時也會發生。例如,在下面的代碼片段中,由于表達式将變量ch1和ch2提升為int類型,需要使用強制類型轉換轉回char類型。

《Java 7程式設計入門經典》一2.15 表達式

如果沒有強制類型轉換,将ch1加到ch2的結果就是int類型,不能賦給變量ch1。

強制類型轉換不僅在指派中的類型轉換有用。例如,考慮下面的示例。它使用強制類型轉換将資料轉化為double類型來獲得結果的小數部分。若不使用強制類型轉換,則涉及的除法僅是整數除法。

《Java 7程式設計入門經典》一2.15 表達式

程式輸出如下所示:

《Java 7程式設計入門經典》一2.15 表達式

在java的表達式中,可以使用水準制表符和空格增加可讀性。例如,下面兩個表達式完全相同,但後者更易閱讀:

《Java 7程式設計入門經典》一2.15 表達式

圓括号從代數角度改變了其中運算的優先級。使用額外的圓括号不會導緻錯誤,也不會降低表達式的執行速度。鼓勵大家使用圓括号來使運作順序更明确,便于後來人閱讀程式。例如,請判斷以下兩個表達式中哪個更容易閱讀:

《Java 7程式設計入門經典》一2.15 表達式