功能评估与声明中的其他效果冲突
Function evaluation conflicting with other effects in statement
我想澄清一下我对 Fortran 求值顺序的理解。
假设我有一个 Stack 类型,方法为 pop
和 push_back
。
如果我执行以下代码:
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
堆栈中的最后一个元素取决于求值顺序,正如 所解释的那样,编译器可以自由更改求值顺序。
但是即使我做了交换运算,还是有问题。
Fortran 2008 标准说 (7.1.4):
The evaluation of a function reference shall neither affect nor be affected by the evaluation of any other entity within the statement.
所以即使是这段代码:
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 中类似):
if a function reference causes definition or undefinition of an actual argument of the function, that argument or any associated entities shall not appear elsewhere in the same statement.
关注声明同
call stack%push_back(pop(stack) - pop(stack))
很明显 stack
是一个实参,并且它在语句中出现了不止一次; stack
由函数 pop
.
定义
是的,您需要使用不同的语句才能达到预期的效果。题中给出的做法是合理的
我想澄清一下我对 Fortran 求值顺序的理解。
假设我有一个 Stack 类型,方法为 pop
和 push_back
。
如果我执行以下代码:
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
堆栈中的最后一个元素取决于求值顺序,正如
但是即使我做了交换运算,还是有问题。 Fortran 2008 标准说 (7.1.4):
The evaluation of a function reference shall neither affect nor be affected by the evaluation of any other entity within the statement.
所以即使是这段代码:
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 中类似):
if a function reference causes definition or undefinition of an actual argument of the function, that argument or any associated entities shall not appear elsewhere in the same statement.
关注声明同
call stack%push_back(pop(stack) - pop(stack))
很明显 stack
是一个实参,并且它在语句中出现了不止一次; stack
由函数 pop
.
是的,您需要使用不同的语句才能达到预期的效果。题中给出的做法是合理的