LPC 语言基础教程:3.3 表达式、语句和数据类型转换

第三节 表达式、语句和数据类型转换

表达式和语句

在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会先转成float3.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_intto_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 函数获取对象的文件名。

如果有相关问题需要讨论,请在本贴下留言。

京ICP备13031296号-4