2 回答

TA貢獻1864條經(jīng)驗 獲得超6個贊
JLS 15.25。解釋了這種行為。
片段#1:
如果第二個和第三個操作數(shù)具有相同的類型(可能是空類型),那么這就是條件表達式的類型
第二個和第三個操作數(shù)都是int
字面量,所以表達式的類型也是int
,不能在byte
沒有顯式轉(zhuǎn)換的情況下分配給變量。因此編譯錯誤。
片段#2:
如果其中一個操作數(shù)是 T 類型,其中 T 是 byte、short 或 char,而另一個操作數(shù)是 int 類型的常量表達式(第 15.28 節(jié)),其值可以用 T 類型表示,則條件表達式的類型是T.
一個操作數(shù)是 a byte
,另一個是int
字面量,其值可以表示為byte
,所以表達式的類型是byte
,可以賦值給一個byte
變量。
片段#3:
如果第二個和第三個操作數(shù)具有相同的類型(可能是空類型),那么這就是條件表達式的類型
第二個和第三個操作數(shù)都是byte
,所以表達式的類型是byte
,可以賦值給一個byte
變量。
片段#4:
由于所有 3 個操作數(shù)都是常量,所以整個三元表達式是一個常量表達式,因此編譯器將此表達式視為一個簡單的賦值 - byte c = 20;
- 這是有效的。

TA貢獻1886條經(jīng)驗 獲得超2個贊
語言規(guī)范中描述了此行為。
案例1和案例3用相同的點來描述:
如果第二個和第三個操作數(shù)具有相同的類型,那么這就是條件表達式的類型。
在情況1中,操作數(shù)是int類型,所以整個表達式是int類型,所以不兼容。在情況 3 中,字節(jié)類型的操作數(shù),因此結(jié)果是兼容的。
情況 2 讓我感到驚訝:我預計它也會失敗,因為 int 操作數(shù)會導致條件表達式為 int 類型。
但是,此行為在以下幾點中進行了描述:
如果其中一個操作數(shù)是 T 類型,其中 T 是 byte、short 或 char,而另一個操作數(shù)是 int 類型的常量表達式(§15.28),其值可以用 T 類型表示,則條件表達式的類型是 T .
20 是一個適合字節(jié)的常量表達式,因此結(jié)果是一個字節(jié)。
情況 4 也由用于情況 1 和 3 的“相同類型規(guī)則的操作數(shù)”來描述;然而,條件現(xiàn)在是常量的事實使它成為常量表達式。
分配給較窄類型的變量時,int 類型的常量表達式會隱式變窄,如賦值上下文中所述:
如果變量是 byte、short 或 char 類型,并且常量表達式的值可以用變量的類型表示,則可以使用收縮原始轉(zhuǎn)換。
添加回答
舉報