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

问题描述

我想澄清我对 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

这是真的吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)