“ n = n”的目的是什么?

问题描述

| 我正在阅读一些Fortran代码,以前的程序员常常每隔一句就抛出“ n = n \”语句。这样做的目的是什么?一些示例代码
if (cmult.lt.5.) then
    kx = 0
    do k=ipd(ii),lpd(ii)
       kx = kx + 1
       p1(kx) = epp_rfc(ipp,k)
       epp_rfc(ipp,k) = cmult*epp_rfc(ipp,k) + x   
       zero(ix)
       p2(kx) = epp_rfc(ipp,k)
       n = n
    enddo

if (cmult.gt.0.) then
    n = n
endif

else
    nk = lpd(ii) - ipd(ii) + 1
    do k=ipd(ii),k) = pp(imem) + zero(ix)
       p2(kx) = epp_rfc(ipp,k)
       n = n
    enddo
endif
    

解决方法

这样的代码经常用于允许程序员在不支持条件断点的调试器中设置断点。 通过在该行上设置断点,只有在if1ѭ时才会命中     ,
n = n
用于检查
cmult.gt.0.
的值并用作“条件断点”的事实在某种程度上是巧合,这并不是上述代码段中出现n = n的原因。 在这种情况下使用n = n的真正原因在于,最流行的编译器从未将源代码中的作用域翻译为汇编语言(计算机不够聪明,无法理解'scope'是什么,除非它是由程序员明确编程的,如果执行了,则程序将运行慢100倍的时间...(因为发出了用于支持范围的逻辑的额外指令)。它只是限制程序员在源代码中的位置,并为代码引入结构,以便链接器和编译器可以执行其工作-或在违反作用域时发出错误。 因为范围不存在,除非comipler小心地插入一些指令(如nop)并调试它的符号以神奇地允许调试器在
enddo
停止,否则不能在
enddo
处暂停。如果n = n,则无法检查这行的结果
p2(kx) = epp_rfc(ipp,k)
,因为值在循环顶部重置。这就是为什么n = n用于在
p2(kx) = epp_rfc(ipp,k)
之后停止并检查每次发声的最终结果的原因。此代码出现之后:
if (cmult.gt.0.) then
    n = n
endif
用于方便(再次您不能在endif或其他地方停下来)的目的,是的,这是一种条件断点。但是再次使用n = n是因为您不能在检查
if (cmult.gt.0.)
之后停下来-您可以在它之后停下来,但不能停在它后面-下一条指令将在外面,否则。我希望这是有道理的。 编辑:如果仍然没有太多意义,这里是附加信息:为了在执行
p2(kx) = epp_rfc(ipp,k)
之后检查
p2(kx)
的值,调试器必须发出指令来检查/获取它-因此需要知道a) ѭ10的大小是多少?b)它的位置-请记住最后一条指令! c)发出适当的指令以获取值“ 10”。对于调试器而言,这一切都是复杂的,因为这实际上是逻辑-调试器必须是\'smart \'(属于AI域),如果调试器可以执行此操作,则终结者现在已经存在。