元组可以比较大小吗?一次返回多个值?编程语言的元组?声明变量一定需要指定类型吗?
目录
元组可以比较大小吗?
一次返回多个值?
编程语言的元组
支持元组的语言
元组的基本特性
元组的初始化和使用
声明变量一定需要指定类型吗?
var类型
元组可以比较大小吗?
不同编程语言对元组的定位稍有差异,是否可以比较大小随语言而定。
- Swift支持元组比较大小,基本规则是元组不同元素按数值大小或者字符串字典顺序比较大小,类似于字符串比较。
- C++11引入元组,C++17支持元组比较大小,前提是所有元素真的可以做比较。
一次返回多个值?
没有元组概念的编程语言,一次返回多个值必须使用结构体、构造数组/列表或者额外利用指针类型参数传入并修改传出(C#使用ref或out修饰符)来完成。
- 元组作为包含多个值的类型,是实现此功能的最优雅方式,当然,如果需要修改外部变量,还是需要指针。
编程语言的元组
元组(tuple)是一个有趣的数组组合,为了方便多个数据统一赋值使用,避免额外建立临时结构体或者对象的开销,也简化一些逻辑代码的编写。 tuple是一种数据结构,可以存储多个元素,尽管元素可以是不同的数据类型,在某些时候,函数返回值可能超过一个类型,tuple很好地解决了这个问题。例如,加法会返回sum和overflow标志。支持元组的编程语言并不多,C#/Python/Swift/Rust 等语言都支持元组。
支持元组的语言
- C#/Python/Swift/Rust/C++11/仓颉 等都支持元组。
- C# 7.0.
- C/ObjC/Java/PHP没有内置元组。
可以用结构体模拟元组。
元组的基本特性
- 长度不可变,元组内容不可变。注意,是元组的内容不可变,元组整体所代表的变量是可被重新赋值的。
元组的初始化和使用
- C# 在.NET Framework 4.0就有Tuple,但创建方式有点复杂,C# 7.0引入ValueTuple,创建更方便。
例如创建result元组: (int, string) result = (1, "OK"); 可通过result.Item1和result.Item2访问两个元素的值。- (int age, string name) = (20, "Bob");
- (int age, string name) p = (21, "Alice");
- int age; string name; (age, name) = (22, "Charlie");
- var p = (23, "Ken");
- Swift 创建元组:
let result = (ret: 1, err_info: "OK")
print(result.ret, result.err_info)
声明变量一定需要指定类型吗?
早期编程语言都需要指定变量类型,随着编程语言不断发展,新的编程语言允许编译器自动推导变量类型,允许不指定变量类型。
- C/ObjC声明变量必须指定类型。
- C++ 11 (2011年)引入auto关键字,可自动推导类型。
- C# 3.0 (2007年)引入var关键字可自动推导类型。这种变量也被称为隐式类型的局部变量,和C++ auto类似。
当然,不止是简单类型变量,对于一些组合的复杂类型,var可避免单独定义类型。当然,元组也可以解决这种需求,根据需要而选。 - Java 10 (2018年)引入var关键字,同样可以自动推导类型。
- Python/Shell/JS 之类的解释型语言,根本无需指定变量类型,解释器会默默分析。
- VB 8之前声明变量必须指定类型,VB 9(包括)之后不一定要指定,可选择编译器自动推导类型。
- Go/Rust/Swift/仓颉 都可选择由编译器自动推导类型。
var类型
不同编程语言可能有var类型,但它们可能是不同含义。
- C# var声明方便了程序员不用写实际类型,但编译器会自动判断出实际类型,编译的IL代码和用实际类型没区别。
- 类似的,Go/Rust有自动类型推导,和C#一样,编译器会推导出类型。
- JS的var就截然不同,它仅仅代表一种类型,编译器并没有看到var推导更多信息,只是作为变量声明或定义的标志。
若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。