Fortran 90及后续版本中能否复用函数结果变量?
Fortran函数体内复用函数名作为局部变量的语法合规性
结论:在Fortran 90及后续标准中,函数名出现在表达式右侧(比如用作累加变量)属于非标准语法,是未定义行为
Fortran标准规定,函数的结果变量(即函数名,或者result指定的变量)仅允许出现在赋值语句的左侧。如果在表达式右侧直接引用它(例如循环中写my_sum = my_sum + x),这种写法没有标准定义的行为,不属于合规的Fortran语法。
虽然Intel Fortran等部分编译器提供了扩展支持,允许这种写法运行,但这并非标准要求,换用其他编译器可能会报错或产生不可预期的结果。
标准合规的写法示例
应该在函数体内声明局部变量完成累加操作,最后再将局部变量的值赋值给结果变量:
function my_sum(arr) result(res) integer, intent(in) :: arr(:) integer :: res, i, total total = 0 do i = 1, size(arr) total = total + arr(i) ! 局部变量负责累加 end do res = total ! 最终赋值给结果变量 end function my_sum
非标准的写法示例(仅部分编译器支持)
function my_sum(arr) result(res) integer, intent(in) :: arr(:) integer :: res, i res = 0 do i = 1, size(arr) res = res + arr(i) ! 直接复用结果变量,非标准 end do end function my_sum
你提到的课件说法是准确的,Fortran标准确实禁止在表达式右侧直接引用函数的结果变量,必须通过局部变量中转后再赋值。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

