在这一行
if ((last_search == NULL) || (last_search != NULL && total_results != 0))
我知道 C 的短路评估规则说,只有last_search
不是 null 才会尝试评估 的右侧||
,因此它相当于写作
if ((last_search == NULL) || (total_results != 0))
有人建议我使用后者,但前者不是更具可读性吗?编译器也不会优化冗余last_search != NULL
吗?
在这一行
if ((last_search == NULL) || (last_search != NULL && total_results != 0))
我知道 C 的短路评估规则说,只有last_search
不是 null 才会尝试评估 的右侧||
,因此它相当于写作
if ((last_search == NULL) || (total_results != 0))
有人建议我使用后者,但前者不是更具可读性吗?编译器也不会优化冗余last_search != NULL
吗?
这是主观的,但不,第一个变体不是更具可读性,因为还有更多要阅读的内容。最易读的代码(也是最少的错误!)是不存在的代码。试想一下,如果您想一次检查 3 或 4 个条件会发生什么。
还有另一个反例:你会写这样的代码吗?
if (number < 0) {
}
else if(number >= 0) {
// why not just "else"?
}
至于性能:编译器可能会优化冗余调用,但撤销性能下降无助于可读性下降。
不,这不对。第二个更具可读性。不管编译器是否会优化它,你为什么要保留冗余检查?
第一个版本告诉您这last_search
不是NULL
因为它到达了那里,但是如果您不能从第一个条件(last_search == NULL
失败)中看出这一点,那么您可能遇到的问题比可读性更大。
不仅短路评估使其不可读,而且还使用了多余的比较。
if ( !last_search || total_results)
比您建议的任何内容都更容易阅读。