C#學習第三彈之給常量賦值可能引發的問題


C#是一種強類型的語言,即變量必須先聲明類型才能夠使用,且變量的使用需要完全符合定義。也就是說,一旦一個變量被指定了數據類型,那么如果不經過類型轉換,它永遠都是這個數據類型。於此相對,弱類型語言是數據類型可以忽略的語言,一個變量可以賦予不同的數據類型的值。

C#支持隱式類型轉換:

1 static void Main(string[] args)
2 {
3     short a = 6;
4     int b = a;
5 }

但是如下代碼:

1 static void Main(string[] args)
2 {
3     int a = 6;
4     short b = a;
5 }

卻會報錯,提示:“錯誤 1 無法將類型“int”隱式轉換為“short”。存在一個顯式轉換(是否缺少強制轉換?) ”。

將int轉化為short是危險的,所以C#並不鼓勵程序員這樣做。

如果一定要這樣寫,可以改成顯式的類型轉換:

1 static void Main(string[] args)
2 {
3     int a = 6;
4     short b = (short)a;
5 }

不過作為程序員,應該留意這條語句可能帶來的問題。

接下來來看這樣一段程序:

1 static void Main(string[] args)
2 {
3     short a = 0xffff;
4     Console.WriteLine(a);
5 }

我們要做的是將0xffff(-1)賦給short型變量a,看似好像沒有任何問題,但編譯器提示:

錯誤 1 常量值“65535”無法轉換為“short”

原因是在C#中的十六進制常量默認是int型的,直接賦值給一個short型的變量顯然行不通。

那么如果我們加上顯式的類型轉換是否就可以了呢?

1 static void Main(string[] args)
2 {
3     short a = (short)0xffff;
4     Console.WriteLine(a);
5 }

編譯依舊不過,只是錯誤提示發生了變化:

錯誤 1 常量值“65535”無法轉換為“short”(使用“unchecked”語法重寫)

看來編譯器還是不允許我們這樣做,試一下unchecked重寫:

1 static void Main(string[] args)
2 {
3     unchecked
4     {
5         short a = (short)0xffff;
6         Console.WriteLine(a);
7     }
8 }

發現終於可以了!

unchecked語法的作用:用於取消整型算術運算和轉換的溢出檢查。

隨后發現C#對溢出有很嚴格的檢查,諸如:int a = 2147483647 * 2; 和 int a = 2147483647 + 1; 的語句正常情況都是不能通過編譯的,2147483647是int能表示的最大值。

而unchecked語法的存在又使得這些語句可以被執行,心中忽然覺得C#這門語言雖然很雜(支持超多關鍵字和語法),但是許多特性還是很實用的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM