gpt4 book ai didi

c - C 中的逻辑 &&

转载 作者:行者123 更新时间:2023-11-30 21:15:29 25 4
gpt4 key购买 nike

逻辑&&运算符执行其左侧的表达式;并且只有当它为 true 时,它​​才会执行右侧的表达式。

但是在下面的例子中,

![C 短路与示例][1]

如果 LHS 为 false 并且 RHS 未执行,则它违反了 C 中运算符的优先顺序,因为一元 NOT 比逻辑 NOT 具有更高的优先级 &&:

![C 运算符优先级摘要][2]

这背后的逻辑是什么?

最佳答案

考虑这个表达式:

a*b + c*d

执行哪个命令?好吧,我们知道 + 必须最后执行,但是这里没有信息关于哪个乘法首先发生。

它可以做到这一点:

t1 = a * b
t2 = c * d
result = t1 + t2

或者,它可以这样做:

t1 = c * d
t2 = a * b
result = t1 + t2

没有办法知道。

现在考虑这个表达式:

a>1 && b<2

从逻辑上来说,也没有理由需要任何特定的评估顺序。两种情况都可能发生,而且没有什么区别。

但是,有时子表达式的计算顺序很重要:

ptr != NULL && ptr->value == 1

因此,为了方便起见,C 定义 && 运算符具有保证计算顺序的特殊行为。

如果 C 以这种方式定义,那么我们就必须这样编写所有内容:

if (ptr != NULL)
if (ptr->value == 1)
result = true

那将是一个 PITA!

除了单纯的文本便利之外,还有另一个原因:优化。

&& 表达式的一半计算结果为 false 时,没有理由检查另一半的结果:这只是浪费时间和电力。所以,编译器想要缩短它。

除了编译器不能删除任何可能具有用户可见(或程序员可见)副作用的内容,除非程序员知道它会发生。

因此,再次强调,必须明确定义行为:先左后右。如果不是,那么它可能会在优化时改变行为,这将是糟糕的。

关于c - C 中的逻辑 &&,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26281447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com