线性搜索和短路评估(运行时错误)

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 运算符),因此由于一个参数的结果,只需检查两个参数之一。例如考虑这些例子,其中AB 是条件,

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 时发生不安全的中止,所有线程都被允许运行

当短路评估可能导致函数未被调用时,是不是有 gcc 警告标志?

左侧分配是否无效,编译时会出现编译错误或评估错误

JavaScript 短路评估错误?

Spark ML 错误:编号不正确。使用线性 SVC 时检测到的类