作者laechan (挥泪斩马云)
看板mud_sanc
标题[wizs] 关於 (int) (float) ... 等用法
时间Sun Jun 24 09:44:11 2018
mud 板 typers 板友有贴文,原文
┌─────────────────────────────────────┐
│ 文章代码(AID):
#1RBSlxn9 (mud) [ptt.cc] [请益] LPC 数值转型 │
│ 文章网址:
https://webptt.com/cn.aspx?n=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
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 122.117.106.224
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/mud_sanc/M.1529804654.A.DB9.html
修正了一些叙述。
※ 编辑: laechan (122.117.106.224), 06/24/2018 18:29:10
1F:→ typers : LPC 并没有 null 这种东西, 上述的 06/24 22:37
2F:→ typers : i=(int)me->query("xxxxx"); 实际会回传 0 06/24 22:38
3F:→ typers : 这个 0 比较特别,在 intp 跟 undefinedp 都会回传 1 06/24 22:39
4F:→ laechan : 跟直觉的想法都不太一样呢(笑 06/25 09:01
5F:→ laechan : 嘛我的意思就是比方被 undefinedp 回传为 1 的情况 06/25 09:06
※ 编辑: laechan (122.117.106.224), 06/25/2018 09:06:41