亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

不一致的“從 int 到 byte 的可能有損轉換”編譯時錯誤

不一致的“從 int 到 byte 的可能有損轉換”編譯時錯誤

慕婉清6462132 2022-11-30 13:44:45
檢查以下代碼片段:片段 #1int a=20;int b=30;byte c= (a>b)? 20:30;Error:incompatible types: possible lossy conversion from int to bytebyte c= (a>b)? 20:30;片段 #2int a=20;int b=30;byte h1=70;byte c= (a>b)? 20:h1;片段 #3int a=20;int b=30;byte h1=70;byte h2=89;byte c= (a>b)? h1:h2;片段 #4byte c= (true)? 20:30;除了 Snippet #1 之外,所有這些都可以正常編譯。這種行為如何合理化?如果代碼段 #1 產生“可能的有損轉換”錯誤,則代碼段 #2 和 4 也應該如此,因為它們仍然包含 type 的文字int。他們為什么編譯成功?
查看完整描述

2 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

JLS 15.25。解釋了這種行為。

片段#1:

如果第二個和第三個操作數具有相同的類型(可能是空類型),那么這就是條件表達式的類型

第二個和第三個操作數都是int字面量,所以表達式的類型也是int,不能在byte沒有顯式轉換的情況下分配給變量。因此編譯錯誤。

片段#2:

如果其中一個操作數是 T 類型,其中 T 是 byte、short 或 char,而另一個操作數是 int 類型的常量表達式(第 15.28 節),其值可以用 T 類型表示,則條件表達式的類型是T.

一個操作數是 a byte,另一個是int字面量,其值可以表示為byte,所以表達式的類型是byte,可以賦值給一個byte變量。

片段#3:

如果第二個和第三個操作數具有相同的類型(可能是空類型),那么這就是條件表達式的類型

第二個和第三個操作數都是byte,所以表達式的類型是byte,可以賦值給一個byte變量。

片段#4:

由于所有 3 個操作數都是常量,所以整個三元表達式是一個常量表達式,因此編譯器將此表達式視為一個簡單的賦值 - byte c = 20;- 這是有效的。


查看完整回答
反對 回復 2022-11-30
?
MM們

TA貢獻1886條經驗 獲得超2個贊

語言規范中描述了此行為。


案例1和案例3用相同的點來描述:

如果第二個和第三個操作數具有相同的類型,那么這就是條件表達式的類型。

在情況1中,操作數是int類型,所以整個表達式是int類型,所以不兼容。在情況 3 中,字節類型的操作數,因此結果是兼容的。


情況 2 讓我感到驚訝:我預計它也會失敗,因為 int 操作數會導致條件表達式為 int 類型。

但是,此行為在以下幾點中進行了描述:

如果其中一個操作數是 T 類型,其中 T 是 byte、short 或 char,而另一個操作數是 int 類型的常量表達式(§15.28),其值可以用 T 類型表示,則條件表達式的類型是 T .

20 是一個適合字節的常量表達式,因此結果是一個字節。


情況 4 也由用于情況 1 和 3 的“相同類型規則的操作數”來描述;然而,條件現在是常量的事實使它成為常量表達式。

分配給較窄類型的變量時,int 類型的常量表達式會隱式變窄,如賦值上下文中所述:

如果變量是 byte、short 或 char 類型,并且常量表達式的值可以用變量的類型表示,則可以使用收縮原始轉換。


查看完整回答
反對 回復 2022-11-30
  • 2 回答
  • 0 關注
  • 231 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號