【问题标题】:What's the difference between a named constant and a static (SAVE) variable, apart from being guaranteed immutable?除了保证不可变之外,命名常量和静态(SAVE)变量之间有什么区别?
【发布时间】:2016-06-24 06:07:57
【问题描述】:

比较

INTEGER, SAVE :: foo = 3

INTEGER, PARAMETER :: foo = 3

他们在哪些方面表现不同?显然,当有人试图改变foo 时,后者会触发编译器错误,但这就像C / C++ 中的const 关键字一样,还是它也暗示了存储位置等?

【问题讨论】:

    标签: fortran constants static-variables


    【解决方案1】:

    parameter 属性用于表示在编译时设置且在运行时无法更改的命名常量。因此,它类似于const 关键字。引用 Fortran 2008 标准,Cl。 5.3.13“参数属性”:

    1 PARAMETER 属性指定实体是命名常量。实体具有由其 constant-expr 指定的值,如有必要,可转换为实体的类型、类型参数和形状。

    [...]

    2 一个命名常量不应被引用,除非它先前已在同一语句中定义,定义在 事先声明,或通过使用或主机协会访问。

    save 属性使变量在超出范围后保持状态,例如在对子例程或模块内部的连续调用之间。除此之外,它的行为类似于普通变量,可以在运行时更改。 Fortran 2008 标准,Cl。 5.3.16 “SAVE 属性”声明

    1 SAVE 属性指定程序单元或子程序的局部变量在执行 RETURN 或 END 语句后保留其关联状态、分配状态、定义状态和值,除非它是 指针及其目标变为未定义 (16.5.2.5(5))。如果它是子程序的局部变量,则由子程序的所有实例(12.6.2.4)共享。

    【讨论】:

    • 是的,但什么是命名常量?它与命名变量有何不同?
    • @leftaroundabout 命名常量是在运行时无法更改的常量。
    • 也许这个关键的事情是一个命名的常量(或组件)可以在一个常量表达式中被引用。没有变量可以(除非被询问)。
    • @francescalus:你能详细说明/举个例子(让它成为答案)吗?
    • @francescalus 对我来说,主要区别在于常量只能在表达式中使用。是的,变量的值不能出现在常量表达式中。
    【解决方案2】:

    首先,常量不是变量。它没有任何存储空间(概念上)。你不能问它的地址。您不能将它放在需要变量的上下文中。您不能将指针指向它。您只能在表达式中使用它。

    例如考虑

      INTEGER, SAVE :: foo = 3
      INTEGER, PARAMETER :: bar = 3
    

    然后

      call sub(foo)
    

    将变量foo 传递给子例程,同时

      call sub(bar)
    

    计算一个表达式(相当简单的一个),将其值存储在某处,并将其传递给子例程。

    你也可以这样做

      INTEGER, PARAMETER :: bar = 3
      INTEGER, SAVE :: foo = bar
    

    同时

      INTEGER, SAVE :: foo = 3
      INTEGER, PARAMETER :: bar = foo
    

    行不通。常量值需要常量表达式。

    【讨论】:

      猜你喜欢
      • 2015-08-11
      • 2011-01-14
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 2019-07-25
      相关资源
      最近更新 更多