C : 使用 && 运算符时是不是存在“惰性求值”,就像在 C++ 中一样?

Posted

技术标签:

【中文标题】C : 使用 && 运算符时是不是存在“惰性求值”,就像在 C++ 中一样?【英文标题】:C : is there "lazy evaluation" when using && operator, as in C++?C : 使用 && 运算符时是否存在“惰性求值”,就像在 C++ 中一样? 【发布时间】:2011-04-26 21:50:14 【问题描述】:

我想知道这看起来是否正确:

while((next !=NULL) && (strcmp(next->name, some_string) < 0) 
    //some process

我的意思是,如果 next 是NULL,那么表达式的第二部分就不会被编译器测试?我听说在 C++ 中就是这种情况(但我什至不确定)。

有人可以确认我不会在某些编译器上遇到奇怪的错误吗?

【问题讨论】:

@Sean:测试不一定等于“有标准保证”。 顺便说一句,这在 C++ 中并不总是如此。表达式:(next != NULL) 可以在 next 的任何类型上使用重载的 != 运算符。该运算符可能会返回另一种类型,其中&amp;&amp; 已重载。并且对于重载的&amp;&amp;,没有内置短路,因此无论 LHS 是什么,都会计算 RHS 上的表达式。 @pmg: 为什么这不是懒惰的评估? @codymanix:延迟评估是关于延迟计算,直到需要结果为止。这是短路,以避免未定义的行为(例如延迟空指针)。 嗯 ... 看起来有些人称之为短路惰性评估(c2.com/cgi/wiki?LazyEvaluation)。我不同意:对我来说,懒惰的评估是“准备评估某事,但现在不要这样做”;短路是“如果现在可以做某事,否则永远不要这样做” 【参考方案1】:

是的,&amp;&amp; 短路了,您正确使用它。如果 nextNULL,则永远不会发生字符串比较。

【讨论】:

【参考方案2】:

是的,在 C++ 中短路 andor 运算符可用。

Here 是 C-faq 中关于该主题的一个问题。

【讨论】:

【参考方案3】:

在 C 和 C++ 中肯定是这样。

【讨论】:

更正:在 C 中肯定是正确的,所以在 C++ 中应该是正确的。 @ruslik - 这不是更正。 C++ 和 C 被标准所涵盖,这个答案对于这两个标准所说的都是正确的(对于 C++ 中的内置类型)【参考方案4】:

这将适用于惰性评估(如果第一个语句被评估为“false”,则不会评估第二个语句),除非您的编译器非常不符合标准,甚至不能被命名为 C 编译器。该领域的数百万行代码都依赖于这种行为,因此您可以认为这种行为是有保证的。

【讨论】:

这叫短路评估,lazy evaluation 是别的东西

以上是关于C : 使用 && 运算符时是不是存在“惰性求值”,就像在 C++ 中一样?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中 运算符&是啥意思?

&= 和 |= 是不是有定义的评估顺序?

C语言里且和或是啥符号

C/C++语言指针用法详解 运算符 & 和 *

&= 和 |= 运算符是不是用于布尔短路?

反应渲染逻辑 && vs 三元运算符