Fortran变量声明与类型系统详解
立即解锁
发布时间: 2025-08-16 01:29:53 阅读量: 13 订阅数: 38 


Fortran 2003: 完整语法与特性指南
### Fortran 变量声明与类型系统详解
#### 1. 声明概述
声明用于指定程序中实体的属性和关系。变量、函数或命名常量的声明类型可以通过类型声明显式指定,也可以由实体名称的首字母隐式指定。`IMPLICIT` 语句可将类型与特定字母关联,或禁用隐式类型。
多态实体是指在程序执行期间其动态类型可以改变的实体。对于多态实体,动态类型可能与声明类型不同。非多态实体也有动态类型,但始终与声明类型相同。
`DIMENSION` 属性用于指定数组,数组可以有显式形状(指定所有边界)、延迟形状(如果同时具有 `ALLOCATABLE` 或 `POINTER` 属性)或假定形状/大小(如果是虚拟参数)。
`ALLOCATABLE` 或 `POINTER` 属性指定在程序执行期间可以动态分配的实体。指针变量可以与现有目标关联,`TARGET` 属性指定变量可以作为指针的目标。
变量的初始化可以在类型声明或 `DATA` 语句中指定。指针可以初始化为未关联状态。
`EXTERNAL` 或 `INTRINSIC` 属性指定过程的性质。`INTENT`、`VALUE` 或 `OPTIONAL` 属性指定虚拟参数的属性。`PARAMETER` 属性指定命名常量。`PUBLIC`、`PRIVATE` 或 `PROTECTED` 属性允许程序员控制模块中指定实体的可访问性和使用。`BIND(C)` 属性便于与 C 数据和函数进行互操作。`ASYNCHRONOUS` 或 `VOLATILE` 属性指定变量的值可能在程序执行的正常流程之外被引用或重新定义。
声明用于指定程序实体的类型和其他属性,实体的属性决定了它在程序中的使用方式。每个变量和函数都有类型,这是最重要的属性,但类型只是实体可能拥有的众多属性之一。属性可以在类型声明或过程声明语句(面向实体的形式)、单独的属性声明语句(面向属性的形式)或这些形式的混合中指定。过程的属性可以在接口体中指定。一些实体,如子程序和命名列表组,没有类型,但可能拥有其他属性。
此外,对象之间的关系可以通过 `EQUIVALENCE`、`COMMON` 和 `NAMELIST` 语句指定。`NAMELIST` 语句为可在输入/输出语句中引用的对象列表指定一个名称。`EQUIVALENCE` 语句表示某些变量共享存储。`COMMON` 语句为一块存储指定一个名称以及该块中的对象名称,这块存储可以在不同的程序单元之间共享。`COMMON` 和 `EQUIVALENCE` 主要是为了与旧版本的语言兼容而提供的,在新程序中很少需要,因为模块可以以更结构化的方式提供替代功能。
一般来说,Fortran 关键字用于声明实体的属性,以下是这些关键字的总结:
| 属性分类 | 关键字 |
| ---- | ---- |
| 类型 | `INTEGER`、`REAL`(和 `DOUBLE PRECISION`)、`COMPLEX`、`LOGICAL`、`CHARACTER`、`TYPE`(用户定义名称) |
| 数组属性 | `DIMENSION` |
| 可分配属性 | `ALLOCATABLE` |
| 指针属性 | `POINTER`、`TARGET` |
| 值定义属性 | `DATA`、`PARAMETER`、`SAVE`、`ASYNCHRONOUS`、`VOLATILE` |
| 模块实体属性 | `PUBLIC`、`PRIVATE`、`PROTECTED`、`BIND` |
| 虚拟参数属性 | `INTENT`、`OPTIONAL`、`VALUE` |
| 过程属性 | `EXTERNAL`、`INTRINSIC` |
在早期版本的语言中,为变量或变量集合赋予每个属性都需要使用不同的语句,例如:
```fortran
INTEGER A, B, C
SAVE
A, B, C
```
在后期版本中,对于有类型的对象,其他属性可以包含在类型声明语句中,例如:
```fortran
INTEGER, SAVE :: A, B, C
```
将属性收集到单个语句中有时对程序读者更方便,它避免了在多个声明语句中查找特定对象的所有属性。程序员可以根据需要强调对象及其属性(面向实体的声明)或属性及其所属对象(面向属性的声明)。也允许使用混合形式,一起指定实体的一些属性,分开指定其他属性。“面向实体”和“面向属性”这两个术语仅用于说明目的,标准中并未实际区分。实体的属性是从所有形式的规范中为其指定的属性收集而来的。不幸的是,在语言内部,程序员无法指定强制执行面向实体的形式。
同一属性不能为一个实体显式指定多次,无论采用何种规范形式。以下是面向实体和面向属性形式的示例:
- 面向实体的声明:
```fortran
REAL, DIMENSION(20), SAVE :: X
```
或
```fortran
REAL, SAVE :: X(20)
```
- 面向属性的声明:
```fortran
REAL X
DIMENSION X(20)
SAVE X
```
或
```fortran
REAL X (20)
SAVE X
```
虽然大多数属性在编译时静态确定,但有些属性可以指定为在程序执行期间变化。具有这种变化属性的变量称为动态变量。可以动态变化的属性包括类型、长度类型参数和数组边界。动态变量有四类:自动、可分配、指针和多态。自动变量是指在进入过程时其动态属性自动确定的变量,但不是虚拟参数或函数结果。虚拟参数和函数结果的例外情况主要是历史原因造成的,因为它们早于动态分配,并且可以在不使用动态分配的情况下实现,因此标准不将它们称为动态变量。长度类型参数和数组边界是可以自动确定的属性。可分配、指针和多态变量的动态属性可以通过可执行语句指定,并且可以是虚拟参数、函数结果或其他变量。
#### 2. 类型声明语句
类型声明语句以类型说明符开头,可选择列出其他属性,最后以拥有这些属性的实体列表结束。此外,类型声明语句可以包含变量的初始值或指针的关联状态。类型声明语句(R501)的形式为:
```
declaration-type-spec [ [ , attribute-spec ] ... :: ] entity-declaration-list
```
其中,声明类型规范(R502)可以是以下之一:
- `intrinsic-type-spec`
- `TYPE ( derived-type-spec )`
- `CLASS ( derived-type-spec )`
- `CLASS ( * )`
属性规范(R503)可以是以下之一:
- `ALLOCATABLE`
- `ASYNCHRONOUS`
- `BIND( C [ , NAME= scalar-character-initialization-expression ] )`
- `DIMENSION ( array-spec )`
- `EXTERNAL`
- `INTENT ( intent-spec )`
- `INTRINSIC`
0
0
复制全文
相关推荐










