首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Fortran在声明和保存属性时赋值的问题

Fortran在声明和保存属性时赋值的问题
EN

Stack Overflow用户
提问于 2010-07-28 20:21:20
回答 2查看 5.5K关注 0票数 20

在fortran 95中,如果在声明时指定变量

代码语言:javascript
运行
复制
integer :: var = 0

它等同于

代码语言:javascript
运行
复制
integer, save :: var = 0

因此,该变量在例程执行后被保留(相当于C语言中的static ),并且在再次调用时不会重新初始化。这种(危险的)行为背后的理论基础/技术问题是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-28 21:48:06

我不认为这样的行为背后有什么理由。

但据我所知Stefano你用错了术语。在您的代码中,没有赋值语句,只有变量()使用初始化表达式(0)进行初始化。

代码语言:javascript
运行
复制
integer :: var = 0 ! type declaration & initialization

integer :: var ! type declaration
var = 0        ! assignment

所以看起来这只是委员会的设计决定。如果我们有这样的表达式(在类型声明语句中带有等号),它是初始化,而不是赋值。并且初始化只在程序(而不是过程)执行期间发生一次。

然而,这样的决定可能有一些历史原因。看一看this线程。

今天,这样的行为是危险的,因为许多其他广泛使用的语言遵循另一种关于初始化/赋值的约定。

票数 10
EN

Stack Overflow用户

发布于 2010-07-28 23:05:00

许多旧的FORTRAN77和更早的编译器静态地分配所有变量。许多程序员依赖于这种行为--从技术上讲,这是他们程序中的一个错误,因为除非他们在声明中使用" SAVE“限定符(或在每个过程中添加一个普通的SAVE语句),否则变量的值在重新进入过程时是未定义的。但由于在那个时代,程序往往与特定的平台和编译器捆绑在一起多年,程序员得以幸免于难。在将遗留的FORTRAN77代码移植到现代>= 90编译器时,这是一个非常常见的“陷阱”。大多数编译器都提供了编译时开关来恢复这种行为,比如gfortran的fno- as选项。委员会认为在声明中初始化的变量很可能需要SAVE属性--在我看来,这是一个合理的设计决策。我认为与其他语言最不同的,也是最容易让会多种语言的程序员感到困惑的是,初始化只进行一次。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3352741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档