编译器为了简化不同类型变量互操作,引入隐式转换。
隐式转换
- C/ObjC/C++/C# 等都支持隐式转换,"小"类型和"大"类型操作,"小"类型自动转换成"大"类型。但隐式转换很可能带来风险。
- 浮点数类型可以隐式转换成unsigned long long, 注意可能损失精度。
- Swift为了消除隐式转换的风险,规定不同类型变量运算,必须强制转换成相同类型
- 比如In8和Int32相加,Int8必须强制转换成Int32才能相加:a是Int8, b是Int32, b = Int32(a) + b
- 字面量运算不受如上限制,编译器会自动推导,例如var c = 1 + 0.1 - 仓颉 同样不支持隐式类型转换,对于二元运算符(除了幂运算符),两个操作数类型必须一致。包括但不限于算术运算符、关系运算符等。
不同的显式类型转换
- 仓颉
- Type(val)
例如Int64(3.5)
- Type(val)
- Swift
- Type(val)
- C/ObjC/C++/C#
- (Type)val
显示转换一定会成功?
- C# 显示转换只是程序员的一种想法,运行时遇到问题一样会抛出异常。
数值和布尔类型转换
- C/ObjC 布尔类型_Bool本质是整型,二者可以互相转换。
- C# 不允许数值和布尔互相转换。