如何解决为什么我的&&条件的第二部分有效仅当第一部分为true时才执行
因此,我实现了字谜标识符,包括通配符,例如nice
是n?ce
的字谜。我的代码有效,但是我不明白为什么它在条件部分起作用。因为我意识到&&条件的第二部分也应该执行第n次。但是事实证明,只有在条件的第一部分为true时才执行它。任何人都可以帮助我理解和澄清,如果这确实是条件语句的行为,那么它仅适用于C吗?非常感谢您的帮助。
这就是我的代码看起来不错的地方。
while (++counter < 26) if((alA[counter] != alB[counter]) && !wildcard--) return "false";
解决方法
如果条件&&的第一部分为假,则不评估第二部分。
这是因为对于&&而言,两个条件都必须为真。如果第一部分的评估结果为假,则无需评估第二部分,因为整个结果只能为假。这就是为什么仅在第一部分为true时才对代码的第二部分进行求值的原因。
通过避免评估第二部分(当第一部分已经为假时),除了逻辑上的事实外,效率得到了改善
,出于逻辑和效率的原因,如果可以从第一部分知道结果,则仅执行语句的一部分。
在您的示例中,如果AND的第一部分为假,那么我们知道结果也将为假,那么为什么还要执行第二部分呢?那样会浪费资源。
另外,请考虑一种通用语言:
if (object != null && object.getProperty() == 5)
如果在已经将第一部分视为错误之后对第二部分进行了评估,则将抛出Null Pointer错误。因此,重要的是,一旦我们确定第二部分实际上不需要评估,就应立即停止。
,逻辑与运算符&&
(和逻辑或运算符||
)具有通常称为短路行为的内容。这意味着,如果仅通过查看左操作数就可以确定表达式的结果,则不会计算右操作数。
对于逻辑AND,如果左侧求值为false,则整个&&
表达式为false,因此右侧不求值。
此行为在C standard的6.5.13p4节中与&&
运算符有关:
与按位二进制
&
运算符不同,&&
运算符保证 从左到右的评估;如果第二个操作数被求值, 在评估之间有一个顺序点 第一和第二操作数。 如果第一个操作数比较 等于0,则不计算第二个操作数。
这使您可以安全地进行如下比较:
if ((pointer != NULL) && (*pointer == 4))
没有短路行为,如果pointer
为NULL并导致段故障,则可以评估右侧。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。