在 Fortran 中,空字符串和非初始化字符串有什么区别?

时间:2021-06-17 09:18:36

标签: string fortran

character(20) :: a='', b 当我定义字符串 a='' 时,a 会得到一个空字符串的值。我没有初始化 b,所以 b 没有价值。我认为内存地址已按定义分配给 ab。但是,空刺和无价值有什么区别?

3 个答案:

答案 0 :(得分:4)

如果你没有定义字符串的值,它的值保持未定义。您不能访问该值,也不能打印它。该内存地址实际会发生什么取决于实现的内部结构和字符串的位置。可能是零个字符,也可能完全是垃圾。

如果您将该值定义为空 "",则字符串将被尾随空格填充,因为 Fortran 在您分配给字符串时会添加尾随空格。

答案 1 :(得分:3)

请注意 Fortran 中的意外行为,声明中的初始化隐含了 save 属性,这意味着初始化仅在第一次调用函数/子例程时有效,以及以后写入的任何内容该字符串将在以后的调用中保留在那里。使函数成为纯函数、元素函数或递归函数将导致编译错误。

一般来说,你应该在声明之后初始化!

所以一般来说,变量应该只声明为 character(20) :: a。现在 a 被分配在内存中,通常在该内存序列中写入的内容将是变量包含的内容,直到您分配给它。如果在没有先赋值的情况下打印它,您将看到这些内存字节的字符串解释。

例如

program t
    character (20) :: hej
    print*,hej
end program 

在运行几次时给出这些随机的东西(在带有 gcc 的 ubuntu 中):

�Ʋ
86+
^�K
VBd�
&��A

答案 2 :(得分:3)

在计算语言中,尤其是在涉及内存时,空或无值的概念没有任何意义,除非您定义空的含义。正如我的编程老师曾经说过的,“在编程中,任何没有计划的事情都必须经过计划”;这意味着无论您想在变量中使用什么值,请确保您自己分配它,否则,它将为编译器、操作系统或其他正在运行的程序分配给您。他们放的东西可能不是你想要的。

正如 Vladimir 在他的回答中所说,如果你没有定义字符串的值,它的值将保持未定义。这里的 undefined 只是意味着无论你用那个值做什么都是不可预测的。换句话说,您应该对该变量执行的第一个操作是为其分配一个值。

字符串变量在编程中的特殊之处在于它们可以分配比实际使用更多的内存空间。可以定义为a = '@',为20个字符预留内存空间,然后使用少于20个字符;例如,通过分配单个字符 ' ',这就是使用尾随空格填充的地方。在这种情况下,fortran 用空格 character(20) :: a='', b 字符填充剩余的 19 个字符。其他编程语言使用其他机制;例如,在C/C++中,建议使用空字符来标记内存空间有用部分的结束;在 Pascal/Delphi 中,字符串变量携带字符串中实际字符的数量;等

有了那个解释和你的陈述aba 之间的区别在于 b 上的任何操作都是可预测的,而 a 上唯一可预测的操作是不解释其当前值(如分配值)的操作,查询长度等。 ba 都是分配的内存空间,b 显式填充尾随空格,而 a 中的值取决于编译器;它可以是默认值(尾随空格),也可以是任何值。 记住乔纳森关于保存属性的评论很重要。因此,如果变量 '' 是在函数或子例程中定义的,则在声明中分配的值 a 仅在第一次调用时得到保证。在任何其他调用中,{{1}} 将使用前一个调用设置的最后一个值。