线性搜索和短路评估(运行时错误)
Posted
技术标签:
【中文标题】线性搜索和短路评估(运行时错误)【英文标题】:Linear Search and Short Circuit Evaluation (run time error) 【发布时间】:2016-05-02 22:10:52 【问题描述】:我正在学习计算机科学(远程学习),我对课本中出现但没有答案的“额外信息问题”感到困惑。这是关于线性搜索算法和短路评估的。
书中的线性搜索算法是这样写的:
指针 = 0 WHILE 指针 ------ 给指针加一 结束 IF 指针 >= LengthOfList THEN: -------- PRINT("项目不在列表中") 其他 -------- PRINT("项目在位置 " +pointer) ENDIF
在额外的信息框中,它讨论了短路评估,以及当布尔运算符链接多个部件时,计算机如何仅在必要时评估第二个条件。所以我得到了条件 1 和条件 2(使用短路评估时)如果条件 1 为假,则不会评估条件 2。
然后它会询问 “如果线路中未使用短路评估,您能否发现可能发生的运行时错误:
WHILE 指针
在过去的两周里,我一直在寻找答案,并在纸上一遍又一遍地用不同的项目运行算法,但我无法弄清楚运行时错误可能是什么。谁能看看他们是否能发现这个错误并向我解释?非常感谢。
【问题讨论】:
这里是否抛出了特定的异常?例如,空指针异常。还是输出有问题? 【参考方案1】:我认为这里需要重新评估这个问题。首先,让我们定义短路评估。短路评估是使用布尔运算符,例如 &&
(AND 运算符)和 ||
(OR 运算符),因此由于一个参数的结果,只需检查两个参数之一。例如考虑这些例子,其中A
和B
是条件,
if(A && B)
根据短路评估,如果 A 为假,则永远不必检查 B,因为无论 B 是什么,A && B
的总体结果都是假的,并且将跳过 if 语句的主体。
if(A || B)
这里根据短路评估,如果 A 为真,则永远不必检查 B,因为无论 B 是什么并且执行 if 语句的主体,A || B
的整体结果都是真的。
现在的问题是如果不使用短路评估会发生什么。所以问题只是询问不同编写算法的错误(注意你上面写的算法完全没问题)。本质上,如果每次迭代都检查 while 循环中的两个条件,会发生什么错误? 因为现在,防止运行时错误的是,在最后一次迭代中,只检查第一个条件防止ArrayIndexOutOfBoundsException
。如果 while 循环的最后一次迭代检查了这两个条件,则会发生运行时错误,因为程序试图访问数组边界之外的元素。
【讨论】:
非常感谢您的解释!最后,程序会尝试访问不存在的索引是有道理的。赞赏。以上是关于线性搜索和短路评估(运行时错误)的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2017 调试错误:为了防止在评估函数 *.toString 时发生不安全的中止,所有线程都被允许运行