第三节 表达式、语句和数据类型转换
表达式和语句
在C语言中我们学过表达式和语句的概念,LPC语言中的运算表达式和C语言相同,在第一章LPC语言的基本语法中有介绍,这里不再重复讲解,如果有问题,请去补充C语言基础知识。
数据类型转换
在表达式做数据运算时,如果运算数据类型不同,会有数据类型转换。
类型的自动转换
某些情况下,C 语言会自动转换某个值的类型,在这一点上LPC语言和C语言一至。
赋值运算
赋值运算符会自动将右边的值,转成左边变量的类型。
(1)浮点数赋值给整数变量
浮点数赋予整数变量时,C 语言直接丢弃小数部分,而不是四舍五入。
int x = 3.14;
上面示例中,变量x是整数类型,赋给它的值是一个浮点数。编译器会自动把3.14先转为int类型,丢弃小数部分,再赋值给x,因此x的值是3。
这种自动转换会导致部分数据的丢失(3.14丢失了小数部分),所以最好不要跨类型赋值,尽量保证变量与所要赋予的值是同一个类型。
注意,舍弃小数部分时,不是四舍五入,而是整个舍弃。
int x = 12.99;
上面示例中,x等于12,而不是四舍五入的13。
(2)整数赋值给浮点数变量
整数赋值给浮点数变量时,会自动转为浮点数。
float y = 12 * 2;
上面示例中,变量y的值不是24,而是24.0,因为等号右边的整数自动转为了浮点数。
混合类型的运算
不同类型的值进行混合计算时,必须先转成同一个类型,才能进行计算。转换规则如下:整数与浮点数混合运算时,整数转为浮点数类型,与另一个运算数类型相同。
3 + 1.2 // 4.2
上面示例是int类型与float类型的混合计算,int类型的3会先转成float的3.0,再进行计算,得到4.2。
类型的强制转换
除了自动转换数据类型,C 语言提供了类型的显式转换,允许手动转换类型,只要在一个值或变量的前面,使用圆括号指定类型(type),就可以将这个值或变量转为指定的类型,这叫做“类型指定”,也称为类型的强制转换。
强制类型转换的格式为:
(type_name) expression
type_name为新类型名称,expression为表达式。
但是在LPC语言中显式转换类型好像没用,即不会报语法错误,也不会转换类型,而且还可能带来BUG,如下示例结果整型 i 变成了浮点型1.23:
void create()
{
float f = 1.23;
int i = (int)f;
debug_message(sprintf("%s", typeof(i)));
}
重点强调:在LPC中不要使用(type_name) expression这种强制类型转换,如果需要强制类型转换,请使用to_int和to_float二个efun。
因为LPC语言和C语言的数据类型有差别,所以在数据类型转换上做一点补充说明。
首先,再次强调,LPC语言中没有字符变量类型,但有字符常量类型,用法和C语言一致,字符常量和整型或实型数据运算时和C语言一样自动转换类型,如下示例:
// 示例:3.3.1
int main(object me, string arg)
{
// 字符常量类型转换运算
float a = 'a';
printf("a = %f\n", a);
// 自动转换成字符串类型
printf("a = %s", a + "\n");
return 1;
}
输出结果如下:
a = 97.000000
a = 97.000000
以上示例中,浮点数据 a 和字符串 "\n" 合并运算后自动转换类型为字符串类型。
其次,在fluffos驱动中对象类型如果和字符串合并运算,对象也会自动转换为字符串类型合并运算,如下示例:
// 示例:3.3.2
int main(object me, string arg)
{
// 对象类型和字符串类型的数据转换
object ob = this_object();
printf("当前文件:%s", ob + "\n");
return 1;
}
输出结果如下:
当前文件:/cmds/3.3.2
示例中对象运算后自动转换成文件名字符串,注意,这种用法旧版MUDOS不支持,如果你的LIB要兼容旧版驱动,请使用 file_name 函数获取对象的文件名。
如果有相关问题需要讨论,请在本贴下留言。