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
的任何类型上使用重载的 !=
运算符。该运算符可能会返回另一种类型,其中&&
已重载。并且对于重载的&&
,没有内置短路,因此无论 LHS 是什么,都会计算 RHS 上的表达式。
@pmg: 为什么这不是懒惰的评估?
@codymanix:延迟评估是关于延迟计算,直到需要结果为止。这是短路,以避免未定义的行为(例如延迟空指针)。
嗯 ... 看起来有些人称之为短路惰性评估(c2.com/cgi/wiki?LazyEvaluation)。我不同意:对我来说,懒惰的评估是“准备评估某事,但现在不要这样做”;短路是“如果现在可以做某事,否则永远不要这样做”
【参考方案1】:
是的,&&
短路了,您正确使用它。如果 next
是 NULL
,则永远不会发生字符串比较。
【讨论】:
【参考方案2】:是的,在 C++ 中短路 and
和 or
运算符可用。
Here 是 C-faq 中关于该主题的一个问题。
【讨论】:
【参考方案3】:在 C 和 C++ 中肯定是这样。
【讨论】:
更正:在 C 中肯定是正确的,所以在 C++ 中应该是正确的。 @ruslik - 这不是更正。 C++ 和 C 被标准所涵盖,这个答案对于这两个标准所说的都是正确的(对于 C++ 中的内置类型)【参考方案4】:这将适用于惰性评估(如果第一个语句被评估为“false”,则不会评估第二个语句),除非您的编译器非常不符合标准,甚至不能被命名为 C 编译器。该领域的数百万行代码都依赖于这种行为,因此您可以认为这种行为是有保证的。
【讨论】:
这叫短路评估,lazy evaluation 是别的东西以上是关于C : 使用 && 运算符时是不是存在“惰性求值”,就像在 C++ 中一样?的主要内容,如果未能解决你的问题,请参考以下文章