强制类型转换

简介: 强制类型转换

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 强制类型转换。
42 0
|
2月前
|
Python
隐式类型转换
隐式类型转换。
31 6
|
8月前
|
程序员 编译器 C语言
c强制类型转换
c强制类型转换
106 2
|
8月前
|
存储 移动开发 API
其他内置类型
本文介绍了 .NET 中的 Console 类和 Environment 类。Console 类提供了控制台输入输出的功能,如设置背景色和前景色、打印文本、读取行和发出蜂鸣声。而 Environment 类则包含有关全局环境的信息和方法,如当前目录、进程路径、处理器数量、操作系统信息等。另外,文章还提及了 .NET Framework 的 AppDomain(用于表示应用程序域,但在 .NET Core 中功能减弱)和 .NET Core 中新引入的 AppContext 类,用于存储全局数据和开关。
|
8月前
|
存储 安全 程序员
C++中的四种类型转换运算符
reinterpret_cast` 则是非常危险的类型转换,仅用于二进制级别的解释,不检查安全性。`dynamic_cast` 用于类的继承层次间转换,向上转型总是安全的,向下转型时会借助 RTTI 进行安全性检查。只有当转换路径在继承链内时,转换才会成功。
|
8月前
|
编译器
强制类型转换
该内容介绍了一种编程中的强制类型转换形式:`(类型名)(表达式)`,用于将表达式的值转换为指定类型。例如 `(double)a` 将 `a` 转换为 `double` 类型,`(int)(x+y)` 把 `x+y` 的和转换为 `int` 类型。当尝试将不匹配的类型赋值时,如 `int a = 3.14`,需要使用强制转换 `(int)3.14` 来取整数部分以避免编译错误。
59 0
|
8月前
|
存储 安全 C语言
C语言强制类型转换运算符
C语言强制类型转换运算符
112 0
|
8月前
|
存储 Java 程序员
强制类型转换运算符的深入解析
在编程中,类型转换是一个常见的操作,它允许我们将一个数据类型转换为另一个数据类型。在某些情况下,编译器可以自动执行这种转换,称为隐式类型转换。但在其他情况下,需要程序员显式地指定转换,这就是所谓的强制类型转换。
49 0
|
8月前
|
C++
c++基本内置类型
c++基本内置类型
58 0
|
8月前
隐式类型转换(整型提升和截断)、强制类型转换的总结
隐式类型转换(整型提升和截断)、强制类型转换的总结