簡體   English   中英

為什么 System.out.println('a' == 97.0) 給出 true

[英]Why does System.out.println('a' == 97.0) give true

我知道 '==' 運算符檢查它們是否存在於 Java 中的同一內存位置,但是為什么,當我比較chardouble數據類型時,Java 給了我true 它們不是不同的數據類型嗎? 以及為什么它沒有給我一個編譯時錯誤,因為根據文檔:

如果我們將 == 應用於對象類型,那么參數類型之間應該存在兼容性(子到父或父到子或相同類型)。 否則,我們將得到一個編譯時錯誤。

我知道'=='運算符是否存在於Java中的相同內存位置...

不適用於原語,僅適用於引用類型(對象)。 Java 語言規范中有== / !=的三個部分:

  1. 數值等式運算符==!=
  2. 布爾等式運算符==!=
  3. 引用相等運算符==!=

doublechar都是數字,所以你參考第一個 它描述了它所經歷的步驟(必要時轉換,必要時提升,必要時值集轉換,必要時拆箱)獲取chardouble並轉換它們以便可以對它們進行數字比較。

在 Java 中, chardouble是原語,它們使用==按值進行比較,而不是按內存位置進行比較,這僅適用於對象(引用類型)。

當您執行'a' == 97.0時,它是chardouble之間的比較。 char是一個無符號整數,與double相比, char經歷了擴大到double的轉換。 字符'a'對應於數值 97,所以當轉換為double時,它​​是 97.0。 並且給定97.0 == 97.0為真,這就是表達式的結果。

另請參閱 Java 語言規范:

  • 15.21.1。 數值等式運算符 == 和 !=

    如果相等運算符的操作數都是數字類型,或者一個是數字類型而另一個是可轉換的( 第 5.1.8 節)數字類型,則對操作數執行二進制數字提升( 第 5.6 節)。

  • 5.6. 數值上下文

    數字提升確定數字上下文中所有表達式的提升類型。 選擇提升類型使得每個表達式都可以轉換為提升類型,並且在算術運算的情況下,該操作是為提升類型的值定義的。 數值上下文中的表達式順序對於數值提升並不重要。 規則如下:

    1. [..]

    2. 接下來,根據以下規則,將加寬基元轉換( §5.1.2 )和縮小基元轉換( §5.1.3 )應用於某些表達式:

      • 如果任何表達式為 double 類型,則提升的類型為 double,並且其他非 double 類型的表達式經歷擴展原始轉換為 double。

暫無
暫無

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

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