强制类型转换

简介: 强制类型转换

Lua 语言在运行时提供了数值与字符串之间的的自动转换( conversion )。针对字符串的所有算数操作会尝试将字符串转换为数值。 Lua 语言不仅仅在算数操作时进行这种强制类型转换( coercion ),还会在任何需要数值的情况下进行,例如函数 math.sin 的参数。


相反,当 Lua 语言发现在需要字符串的地方出现了数值时,它就会把数值转换为字符串:

print(10 .. 20)  --> 1020


当在数值后紧接着使用字符串连接时,必须使用空格将他们分开,否则 Lua 语言会把第一个点当成小数点


很多人认为自动强制类型转换算不上是 Lua 语言中的一项好设计。作为原则之一,建议最好不要完全寄希望于自动强制类型转换。虽然在某些场景下这种机制很便利,但同时也给语言和使用这种机制的程序带来了复杂性。


作为这种二类状态的表现之一, Lua5.3 没有实现强制类型转换与整型的集成,而是采用了另一种更简单和快速的实现方式:算数运算的规则就是只有在两个操作数都是整型值时结果才是整型。因此,由于字符串不是整型值,所以任何有字符串参与的算术运算都会被当做浮点运算处理:

> "10" + 1        --> 11.0


如果需要显示地将一个字符串转换成数值,那么可以使用函数 tonumber 。当这个字符串的内容不能表示为有效数字时干函数返回 nil ;否则,该函数就按照 Lua 语法扫描器的规则返回对应的整型值或浮点型值:

> tonumber("   -3  ")     --> -3
> tonumber(" 10e4 ")      --> 100000.0
> tonumber("10e")         --> nil   (not a valid number)
> tonumber("0x1.3p-4")    --> 0.07421875


默认情况下,函数 tonumber 使用的是十进制,但是也可以指明使用二进制三十六进制之间的任意进制

> tonumber("100101", 2)       --> 37
> tonumber("fff", 16)         --> 4095
> tonumber("-ZZ", 36)         --> -1295
> tonumber("987", 8)          --> nil


在最后一行中,对于指定的进制而言,传入的字符串是一个无效值,因此函数 tonumber 返回 nil


调用函数 tostring 可以将数值转换成字符串:

> print(tostring(10) == "10") --> true


上述的这种转换总是有效,但我们需要记住,使用这种转换时并不能控制输出字符串的格式(例如,结果中十进制数字的个数)。


与算数操作不同,比较操作符不会对操作数进行强制类型转换。请注意, "0"0 是不同的。此外, 2<15 明显为真,但 "2"<"15" 却为假(字母顺序)。为了避免出现不一致的结果,当比较操作符中混用了字符串和数值时, Lua 语言会抛出异常。

目录
相关文章
|
存储
C 强制类型转换
C 强制类型转换。
40 0
|
10天前
|
Python
隐式类型转换
隐式类型转换。
21 6
|
6月前
|
程序员 编译器 C语言
c强制类型转换
c强制类型转换
85 2
|
6月前
|
编译器
强制类型转换
该内容介绍了一种编程中的强制类型转换形式:`(类型名)(表达式)`,用于将表达式的值转换为指定类型。例如 `(double)a` 将 `a` 转换为 `double` 类型,`(int)(x+y)` 把 `x+y` 的和转换为 `int` 类型。当尝试将不匹配的类型赋值时,如 `int a = 3.14`,需要使用强制转换 `(int)3.14` 来取整数部分以避免编译错误。
49 0
|
6月前
|
存储 Java 程序员
强制类型转换运算符的深入解析
在编程中,类型转换是一个常见的操作,它允许我们将一个数据类型转换为另一个数据类型。在某些情况下,编译器可以自动执行这种转换,称为隐式类型转换。但在其他情况下,需要程序员显式地指定转换,这就是所谓的强制类型转换。
38 0
|
6月前
隐式类型转换(整型提升和截断)、强制类型转换的总结
隐式类型转换(整型提升和截断)、强制类型转换的总结
|
安全 程序员 编译器
【C++】C++中的类型转化
说起类型转化,我们在C语言之前的学习中可以了解到,类型转换可以分为两种情况:隐式类型转化;显示类型转化。但是为什么在c++中还要继续对类型转化做文章呢?我们一起来看:
87 0
【C++】C++中的类型转化
|
编译器 C++
C++隐式类型转换
C++隐式类型转换
155 0
|
C语言 C++
【C++中的类型转换】C语言类型转换与C++类型转换对比,以及4种C++类型转换详解
【C++中的类型转换】C语言类型转换与C++类型转换对比,以及4种C++类型转换详解
323 0
【C++中的类型转换】C语言类型转换与C++类型转换对比,以及4种C++类型转换详解
|
存储 大数据
类型转化问题
关于类型转换问题,通俗的讲就是,把碗里的东西可以倒进锅里而不会溢出 如果把锅里的东西倒进碗里,那么就会溢出,如果硬要倒就是强制转换,会产生 数据分割,从而改变数据的本质。
101 0
类型转化问题