能否强制Fortran遵循逻辑运算参数求值顺序?如何避免索引错误
Fortran逻辑判断越界问题解答
原因:传统逻辑运算符不支持短路求值
Fortran的.and.属于传统逻辑运算符,它的求值规则是左右两侧表达式都会被完整计算,不管左侧结果是否已经能确定整个逻辑表达式的结果。所以当i=1时,哪怕i /=1已经是假,var(i) > var(i-1)依然会被执行,导致访问var(0)触发数组越界错误。
无需嵌套if的解决方法
方案1:调整循环起始索引(推荐)
直接把循环的起始值设为2,从根源上避免i=1的情况,不需要额外的索引判断:
do i = 2, n if (var(i) > var(i-1)) then ! do something end if end do
这种方式代码更简洁,运行效率也更高,是最常用的处理手段。
方案2:使用短路逻辑运算符(Fortran 2008+)
如果业务逻辑要求循环必须从1开始,可以使用Fortran 2008标准新增的短路逻辑与运算符&&。它会在左侧表达式为假时,直接跳过右侧表达式的计算:
do i = 1, n if (i /= 1 && var(i) > var(i-1)) then ! do something end if end do
注意:需要确认你的编译器支持Fortran 2008或更高版本,比如gfortran 4.6+、Intel Fortran 12+都支持该特性。
内容的提问来源于stack exchange,提问作者nikost
相关产品推荐
相关产品推荐

