首先看下面的一段小程序
int num = ;
if(num>){
char c = (char)(num +A)
Systemoutprintln(I want to get a char: +c)
}else{
Systemoutprintln(num)
}
/*
輸出結果為
I want to get a char: D
*/
上面的行~行代碼可以簡化成一行代碼因為三元運算符的存在但是相較起來上面的更具有可讀性而三元運算符的使用可以顯示你編程的牛叉
Java中三元運算符表達如下
[條件語句] ? [表達式
] : [表達式
]
則上面的代碼可以轉換寫成如下形式
// 代碼片段 System
out
println(
I want to get a char :
+ (num>
?num
+
A
:num));
/*
或者寫成下面的形式
比較明了
*/
System
out
print(
I want to get a char :
);
System
out
println( num>
?num
+
A
:num);
/*
以上結果均輸出:
*/
看來語法改變了結果也跟著變了
對表達式 num+A 做了如下的改變並查看結果如下也非所願還是 D的ASCII碼值:
//代碼片段 System
out
println(num>
?(char)(num
+
A
):num);
/*
輸出結果是
*/
將輸出語句中的格式再次變化下結果才是想要的字符D
//代碼片段 System
out
println((char)(num>
?(char)(num
+
A
):num));
System
out
println((char)(num>
?num
+
A
:num));
/*
二者均是輸出的字符
D
*/
為什麼呢?Java虛擬機幽了你一默以下是對這個問題進行探究的過程僅供參考若有問題請及時指正
查了println()的實現是函數的重載根據參數列表中的不同類型進行輸出的比如上面的小例子依次調用的是:
println(int x) // 代碼片段
的調用
println(int x) // 代碼片段
的調用
println(char x) //代碼片段
的調用
那麼對已代碼片段代碼片段的輸出結果只能從Java操作符為了防止類型溢出所做的隱式轉型處理這個角度來解釋了所以在上面兩個片段中表達式的結果分別是char和intJava編譯器當然會將其中較窄的char隱式轉型為較寬的int接著片段做了顯式轉型處理將寬的int轉型為窄的char
如所言那下面的結果該如何解釋呢?先看代碼:
int num =
;
char x =
X
;
System
out
println(num>
? x:num); //X 的ASCII值
System
out
println(num>
? num:x);// num 的數值:
System
out
println(num>
? x:
); // 輸出的是 X 的 值
System
out
println(num>
?
:x); // 輸出的是 ASCII碼值為
所對應的字符:Z
嗯? 上面的解釋在這裡說不通莫非對常量和變量還有不同的編譯方式
個人認為是如果一個表達式的類型是byteshortchar類型的而另外一個是int類型的常量表達式且int的值若可以用類型byteshortchar三者之一表示的那麼返回的結果則是三者之一
綜上所述可以總結為如下三點:
如果表達式和表達式操作數具有相同的類型那麼它就是條件表達式的類型
如果一個表達式的類型是byteshortchar類型的而另外一個是int類型的常量表達式且int的值若可以用類型byteshortchar三者之一表示的那麼返回的結果則是三者之一
表達式類型不一致的時候可以顯式強制轉換最終的類型
到此為止了若你有什麼好的想法可以追加歡迎討論
嗯對了表達式也可以是一個函數調用這裡就不在贅述了
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26037.html