问题的历史:
逻辑运算符&&和||在C语言中被引入用于检查复杂的逻辑条件。它们的工作特点是支持短路评估:如果结果可以仅通过第一个操作数明确地确定,则第二个操作数不计算。
问题:
许多程序员期望两个操作数始终都被计算,或者错误地使用第二个操作数的副作用,认为它必定会执行。实际上,这会导致错误、资源泄漏和意外行为。
解决方案:
理解短路评估机制有助于构建安全的结构,特别是在指针、资源和文件检查中。右侧表达式中使用副作用只能在明确的情况下使用。安全检查的示例:
if (ptr && ptr->field) { /* ... */ }
关键特点:
在片段if (0 && f())中,表达式f()是否会被执行?
不会,函数f()不会被调用,因为结果已经明确——表达式为假,进一步计算是无用的。
在下一个语句中:if (1 || f())呢?
再次,f()不会被调用:第一个操作数后结果已经为真。
可以使用运算符&&和||来控制具有副作用的函数执行顺序吗?
从技术上讲,可以,但这种控制会导致不易读和不稳定的代码。最好明确列出函数调用的顺序,而不依赖于短路行为来处理副作用。
if (flag || process()) { // ... }
如果flag为真,process永远不会被调用。
优点:
缺点:
if (!flag) process();
优点:
缺点: