c - e1 && e2 是否等同于 e2 && e1?

标签 c

e1e2 是两个 bool 表达式。那么e1 && e2是否等同于C语言中的e2 && e1

我的直觉告诉我是的。通过简单的逻辑,A & B 等同于 B & A。在 C 中也是如此吗?

最佳答案

从逻辑上讲,是的。从逻辑的角度来看,e1 && e2 永远不会有与 e2 && e1 不同的结果。

但是从代码的角度来看,如果 e1e2 的计算有副作用,那么没有,它们并不完全等价。

具体来说,有时人们使用 functions in a chain of && .

if( isHungry() && hasFood() )  eat() ;

通常您希望将最便宜放在评估条件第一个,并且只检查第二个条件如果第一个条件为真短路评估 可确保发生这种情况。如果 AND 逻辑运算中的第一个条件 为 false,则甚至不会评估第二个语句,因为最终结果无论如何都不会为 TRUE (FALSE && (TRUE && TRUE &&真 && 真)) == 假)

换句话说,如果您不饿,您就不会费心去检查冰箱。

有时人们依赖会发生短路评估这一事实,并编写依赖于它的代码。此类事情显示在下面的评论中:

if( x && x->eval() ) { /* do something */ }

因此,假设上面的 x=NULL。会发生什么?尝试引用空指针?是不是应该写成

if( x )
{
    if( x->eval() )
    {
        // do something
    }
}

我说不行!短路评估意味着,如果 x==0&& 运算符的正确操作数 甚至不会在 if 中查看 ( x && x->eval() )x->eval() 不会被求值,也不会出现空指针异常。

您必须注意的另一件事是如果您在 if 语句中运行的函数有副作用,例如递增某种计数器。因此,如果 hasFood() 有一个内部计数器增量,例如 fridgeCount++

即使是短的 cct 评估,该函数也不会运行,因此您预期在点击 if 语句时会发生的任何副作用都可能不会发生。

OR 运算符也有短路评估,仅在 if( e1 || e2 ) 中,如果 e1 为 TRUE,则语句短路为 TRUE (然后甚至不评估 e2,整个表达式被视为 TRUE)。

这种行为适用于 C/C++、Java、JavaScript、PHP、Python 和许多其他语言。

关于c - e1 && e2 是否等同于 e2 && e1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18772675/

相关文章:

c - 嵌入式 Linux(32 位)的 2038 年解决方案?

c - 释放 C 结构体的字符串成员

用多个包含路径编译c语言

c - MAKE如何记住文件时间戳

c - 如何使用 wc_EccPublicKeyDecode 在 Wolfssl 中导入 der 证书

检查宏中函数的返回值

c - 链表 C/Struct

C 预处理器宏定义的优先级

c - 限制用户输入整数?

c - c中抛出异常错误