变量声明是否可以放在语句之后?变量声明?声明变量一定需要指定类型吗?函数范围快捷使用临时变量?
变量声明是否可以放在语句之后?
- 除了C89必须将变量声明放在语句之前,其他主流编程语言基本都支持变量声明和语句混合使用。
- Fortran/C89/Pascal 只能将变量声明放在语句之前。
准确的说,Pascal的变量声明必须放在程序的说明定义部分,即程序首部之后,执行部分之前。 - C99/C++/Java/C# 等语言允许变量声明放在语句之后。
- ObjC根据所用Clang/GCC版本决定是否允许声明在语句之后。
- Python/JS 作为解释型语言,自然允许声明/定义在语句之后。
变量声明放在开始的好处
- 变量声明统一放在函数开始,有一个好处是很清晰,使用到哪些变量很好维护。
变量声明
声明有的时候很有作用,大国对抗所谓的"声明"其实就是赤裸裸的"威胁",但声明显得更文明。
不同语言的声明
- 越古早的语言,越需要声明,越像脚本的语言,越对声明不严格。
- Perl需要显式声明变量。
- PHP不需要显式声明变量,声明可以和赋值同时进行。
- Python是Shell的改进版,不需要特别声明,想用就直接用。
- C/ObjC/C++/Java/C#/Rust/Go/Swift/仓颉/VB/Fortran/Pascal 都需要先声明(或者被绑定),才能使用。
- JS比较特殊,大部分情况下都需要先用let或var声明变量再使用,但可以在不声明变量的情况下直接赋值,这会导致该变量被隐式地创建为全局变量,大概率不是预期。
- 比如在没声明a的前提下给a赋值,创建了一个全局变量:a = 1
变量声明的默认值?
- C/ObjC/C++变量声明但未初始化,默认值是不确定的。
- Java基本变量只声明不初始化,就使用,编译器会报错。注意,如果是类成员变量,对象初始化后成员没有显式初始化,默认值是0.
变量声明缺省类型?
对于支持缺省类型的编程语言,初始化可以用缺省类型,但如果是声明,缺省类型就不能缺少。
- Swift/仓颉 等编程语言的变量声明,必须指定类型,因为编译器不知道缺省类型。
变量前缀
- 大部分编程语言变量不需要有特别前缀。
- PHP变量需要有$前缀,例如$result.
声明变量一定需要指定类型吗?
早期编程语言都需要指定变量类型,随着编程语言不断发展,新的编程语言允许编译器自动推导变量类型,允许不指定变量类型。
- 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推导更多信息,只是作为变量声明或定义的标志。
函数范围快捷使用临时变量?
对于脚本语言或解释型语言,变量甚至不需要加类型,即开即用。对于不少编译型语言而言,函数范围使用临时变量依然需要加上类型,这是语法绕不掉的。尽管如此:
- Go语言提供了便捷的函数范围使用临时变量的新语法 ":=", 节省了类型定义的负担,也被称为"短变量声明", 注意,仅可用于函数范围。例如:
- func test() {
i := 1
// ......
}
- func test() {
若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。