2016年12月23日 星期五

給新手的C++教學 (上冊) - 13 - 10. 轉型

回到「給新手的C++教學 (上冊)」

回到「13. 額外語法 (Extra syntax)」

上一頁

註: 小莫使用的程式碼上色網站掛掉了,因此本頁的程式碼都沒有顏色,等該網站恢復之後會再進行程式碼上色的動作,暫時造成不便敬請見諒。若您發現該網站已經恢復運作,本頁程式碼卻還沒更新,也歡迎以各種方式提醒小莫哦~ ^_^

顧名思義,「轉型」就是「轉換型別」
「將某個小數無條件捨去到整數位」就是「從float『轉型』到int」的一個例子
因為小數位不見會變成整數 (int) 嘛XD

不過,「轉型」並不是把某個變數a的型別從float「變成」int,而是依據a的值「產生」一個int變數,其值接近型別為float的a (為甚麼說接近? 因為你不可能把一個int變數的值設定成2.4,頂多設定成2或3)

那麼,要怎麼將一個變數「轉型」呢?
只要在前面加上「(目標型別名稱)」就好了!

以下是將2.4從float轉型成int的例子:

#include<cstdio>
int main()
{
    float a=2.4;
    printf("a=%f\n",a);
    printf("(int)a=%d\n",(int)a);
    printf("a=%f\n",a);
    int b=(int)a;
    printf("b=%d\n",b);
    return 0;
}

型別為float的a轉型成int之後值從2.4變成2
然而,將a轉型並不會修改到a本身
而是產生一個值為2的int變數
我們可以自行宣告一個int變數b來把轉型產生的2「接起來」
至於為甚麼會有橘色的警告,在下一頁會做解釋

注意到,「a」經轉型後還是2.4,也就證明了「轉型」並不會修改到變數本身,而是「產生」出一個指定型別 (在這個例子中是int) 的新變數
我們可以自行宣告一個int變數b來「接住」轉型產生的新變數的值 (請見程式碼中第8行)

這就是轉型

但轉型可不只這種方式
依據轉型的方式可將轉型分為「強制轉型」和「隱含轉型」
剛剛提到的方法屬於「強制轉型」

「隱含轉型」發生在兩個不同型別的變數做運算的時候,例如相加
不同型別的變數不能直接進行運算,因此電腦會自動先將其中一個變數轉型成和另一個變數相同的型別,再做計算
例如:

#include<cstdio>
int main()
{
    int a=3;
    float b=2.4;
    float c=a*b;
    printf("%d * %f = %f\n",a,b,c);
    return 0;
}

型別為int的a和型別為float的b相乘的結果是一個型別為float的變數
至於為甚麼會多出第二個警告:[Warning] conversion to 'float' from 'int' may alter its value [-Wconversion]
這是因為float的精度不夠高,因此從int轉型到float有可能會造成微小的誤差,這就是電腦想表達的意思

這和以下程式碼的邏輯是一模一樣的:

#include<cstdio>
int main()
{
    int a=3;
    float b=2.4;
    float c=((float)a)*b;
    printf("%d * %f = %f\n",a,b,c);
    return 0;
}

也就是,電腦會自動將型別為int的變數a轉型為float之後再和b做運算 (相乘),因而算出型別為float的答案c ($3*2.4=7.2$)

為甚麼是「把a轉型成float」而不是「把b轉型成int」呢?
這是C++的規定,規則如下:
  1. 如果是「小數」和「整數」做運算,則將「整數」轉型成「小數」(整數和小數的定義)
  2. 如:「float」和「int」做運算會將「int」轉型成「float」

  3. 對「整數」來說,如果是「有號 (signed)」和「無號 (unsigned)」做運算,則將「有號」轉型成「無號」(如果不知道unsigned是啥可以自行上網搜尋,或者不用理會這點XD)
  4. 如:「int」和「unsigned int」做運算會將「int」轉型成「unsigned int」

  5. 如果是「範圍大或精度高 (誤差小)」和「範圍小或精度低 (誤差大)」做運算,則將「範圍小或精度低」轉型成「範圍大或精度高」
  6. 如: 「float」和「double」做運算會將「float」轉型成「double」、「long long」和「int」做運算會將「int」轉型成「long long」

  7. 不轉型,因為如果1.、2.、3.都不成立,則兩數型別相同

若懶得記住以上規則,您大可直接使用「強制轉型」的做法來控制所有跨型別運算的轉型方向,沒有問題的!

關於轉型的介紹就到此為止,有任何疑問歡迎在以下留言區提出哦~ ^_^

下一頁

感謝:
(版權所有 All copyright reserved)

沒有留言:

張貼留言

歡迎留言或問問題~
若您的留言中包含程式碼,請參考這篇
如果留言不見了請別慌,那是因為被google誤判成垃圾留言,小莫會盡快將其手動還原

注意:只有此網誌的成員可以留言。