[wizs] 關於 (int) (float) ... 等用法

作者: laechan (揮淚斬馬雲)   2018-06-24 09:44:11
mud 板 typers 板友有貼文,原文
┌─────────────────────────────────────┐
│ 文章代碼(AID): #1RBSlxn9 (mud) [ptt.cc] [請益] LPC 數值轉型 │
│ 文章網址: https://www.ptt.cc/bbs/mud/M.1529727995.A.C49.html │
└─────────────────────────────────────┘
大意是,如果把以下的 code 貼到running 去跑的話:
// int i 在 running code 預設為已宣告
if(1)
{
float f=3.14;
i=(int)f;
if(intp(i))
write("i 是整數.\n");
else if(floatp(i))
write("i 是浮點數.\n");
else
write("i 是其它型態.\n");
}
執行結果:
========== 程式執行區 ==========
i 是浮點數.
========== 程式執行區 ==========
也就是說,看起來,(int) 的動作並非表面地把它後面接的
東西強制變成整數型態,而是實際上比方阿銀跟伊莉莎白站
在一起時,我們原本能區分他們的不同(兩者是不同型態),
而 (int)阿銀這個動作就類似把伊莉莎白裝套在阿銀身上,
這時阿銀的型態就會被視為是伊莉莎白,使 i = (int)阿銀
這樣的程式段不會出 error。
(各位可想成若 i = f 就會出 error, i = (int)f 則不會)
但是實際上它做的事情,是把伊莉莎白變成了阿銀。
(即 i 變成了 f,這裡是指等號兩邊都接變數時)
那為啥這樣寫不會出問題? 因為實際上我們很少把一個已經
宣告為 float 的 "變數" 再用其它型態的變數去 = 它,我
們通常是這樣做:
int lv = (int)ppl->query("level");
string names = (string)ppl->query("name");
mapping data = (mapping)ppl->query("guild");
也就是說通常我們用到的場合,等號後面接的是一個讀取值
的動作,而不是一個明確的宣告變數。
但大家仍要注意,它可能會有 bypass 某些 error 產生的情
況,既然是 error 就應該被呈現出來而不是被忽略無視。
之所以不說"看起來等號後面的動作會變更等號前面的變數型
態",是因為底下的 running code:
i=(int)me->query("xxxxx"); // 實際上讀出的值為 null
if(intp(i)) write("i 是整數.\n");
else write("i 是其它型態.\n");
========== 程式執行區 ==========
i 是整數.
========== 程式執行區 ==========
若按照上面的說法,則 i 應該是其它型態,值應該是 null。
Laechan

Links booklink

Contact Us: admin [ a t ] ucptt.com