为什么我的&&条件的第二部分有效仅当第一部分为true时才执行

问题描述

因此,我实现了字谜标识符,包括通配符,例如nicen?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并导致段故障,则可以评估右侧。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...