關於 (int) (float) ... 等用法 - 聖殿英雄傳說 MUD
By Mary
at 2018-06-24T09:44
at 2018-06-24T09:44
Table of Contents
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
--
┌─────────────────────────────────────┐
│ 文章代碼(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
--
Tags:
線上
All Comments
By Oscar
at 2018-06-29T09:42
at 2018-06-29T09:42
By Steve
at 2018-07-04T09:41
at 2018-07-04T09:41
By Poppy
at 2018-07-09T09:40
at 2018-07-09T09:40
By Connor
at 2018-07-14T09:38
at 2018-07-14T09:38
By David
at 2018-07-19T09:37
at 2018-07-19T09:37
Related Posts
TiZi、WooHyaL加入OC隊伍XL2
By Catherine
at 2018-06-24T08:52
at 2018-06-24T08:52
しゃどばすチャンネルSP第8回 巫/皇傳說
By Barb Cronin
at 2018-06-24T07:05
at 2018-06-24T07:05
kabaji 單排補位爬分台D6 往宗師邁進!
By Freda
at 2018-06-24T01:22
at 2018-06-24T01:22
IDDQD終獲解放,得以開口:“保持耐心,
By Eartha
at 2018-06-24T00:11
at 2018-06-24T00:11
2nd Anniversary人氣主戰者投票詳細票數
By Brianna
at 2018-06-23T22:50
at 2018-06-23T22:50