对 C 语言中变量的声明和定义,可以这样用类比 Java 的方式来理解吗?
平时工作过程中主要写 Java,因为对底层比较感兴趣,所以最近在学 C 语言和 Unix 。看 K & R 的过程中总体觉得都满顺畅的,不过因为自身对操作系统和编译原理不怎么了解,也没有 C 项目的实践经验……所以对书中提及的一些细节概念还不确定,想向各位请教一下。
- 把函数原型写到后缀名为 .h 的头文件,这种行为是不是类似于 Java 中的定义 interface,可以告诉调用方这些函数的调用方式,然后头文件中声明的函数原型类似于 Java 中的 interface 的方法。
- 在 C 语言中,对于外部变量的 static 关键字,可以类比为 Java 中的 private 关键字吧,用于将变量的作用域限制在当前的源文件(在 Java 中是对象)中,避免对全局环境造成影响。
- K & R 书中提及「将外部变量的 声明 与 定义 严格区分开来很重要」,还有一个初始化的概念。变量的声明仅是说明变量的类型,不会引起存储器的分配,例如使用 extern 关键字仅是表示它声明的变量是来自于外部源文件中。变量的定义是在变量声明的基础上,还会引起存储器的分配存储单元。然后,变量的初始化和赋值是需要在存储器分配存储单元(也意味着是需要在变量定义)之后才能进行的吧,如果仅是变量声明的话,则无法进行变量的初始化和赋值。在 Java 中 new 对象时候,类的成员字段在没有显式初始化的情况下,会被赋予一个默认值,这样的行为是不是可以理解为 C 语言中变量定义 + 初始化的这两个概念?另外,Java 类的方法中的变量不会被初始化,(下面是一些假设)如果 JVM 是在
int a;这一步中为变量分配存储单元的话,那么这就应该理解为 C 语言中的变量定义,如果 JVM 是在a=10;这一步中为变量分配存储单元的话,而不是int a;的话,那么int a;就应该理解为 C 语言中的变量声明。对变量声明、定义这两个概念可以这么理解么。