微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

函数求值与语句中的其他效果冲突

如何解决函数求值与语句中的其他效果冲突

我想澄清我对 Fortran 中计算顺序的理解。

假设我有一个包含方法 poppush_back 的 Stack 类型。 如果我执行以下代码

call stack%push_back(1)
call stack%push_back(3)
call stack%push_back(stack%pop() - stack%pop())
write(*,*) stack%pop()    ! Could print 2,or -2

堆栈上的最后一个元素取决于求值顺序,正如 answer 解释的那样,编译器可以自由更改求值顺序。

但是即使我有一个可交换的操作,仍然存在问题。 Fortran 2008 标准说 (7.1.4):

函数引用的求值既不会影响语句中任何其他实体的求值,也不会受其影响。

所以即使是这段代码

call stack%push_back(1)
call stack%push_back(3)
call stack%push_back(stack%pop() + stack%pop())

不符合标准吗?

这意味着我总是要这样写:

call stack%push_back(1)
call stack%push_back(3)
block
    integer :: A,B
    A = stack%pop()
    B = stack%pop()
    call stack%push_back(A - B)
end block
write(*,*) stack%pop()    ! is guaranteed to print 2

这是真的吗?

解决方法

(这里我们假设问题中事物的合理和直观的定义,并暗示答案中的相似。)

声明

call stack%push_back(stack%pop() - stack%pop())

由于问题中所述的原因,确实会无效。但是,根据对中的其他限制(未引用)可能更容易看到这一点(Fortran 2018 10.1.4,但在 F2008 中类似):

如果函数引用导致定义或取消定义函数的实际参数,则该参数或任何相关实体不得出现在同一语句的其他地方。

关注声明与

相同
call stack%push_back(pop(stack) - pop(stack))

很明显,stack 是一个实际参数并且它在语句中出现了不止一次; stack 由函数 pop 定义。

是的,您需要使用不同的语句来达到预期的效果。问题中给出的方法是合理的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。