2

在这一行

if ((last_search == NULL) || (last_search != NULL && total_results != 0))

我知道 C 的短路评估规则说,只有last_search不是 null 才会尝试评估 的右侧||,因此它相当于写作

if ((last_search == NULL) || (total_results != 0))

有人建议我使用后者,但前者不是更具可读性吗?编译器也不会优化冗余last_search != NULL吗?

4

3 回答 3

10

这是主观的,但不,第一个变体不是更具可读性,因为还有更多要阅读的内容。最易读的代码(也是最少的错误!)是不存在的代码。试想一下,如果您想一次检查 3 或 4 个条件会发生什么。

还有另一个反例:你会写这样的代码吗?

if (number < 0) {
}
else if(number >= 0) {
    // why not just "else"?
}

至于性能:编译器可能会优化冗余调用,但撤销性能下降无助于可读性下降。

于 2012-09-17T15:32:53.393 回答
5

不,这不对。第二个更具可读性。不管编译器是否会优化它,你为什么要保留冗余检查?

第一个版本告诉您这last_search不是NULL因为它到达了那里,但是如果您不能从第一个条件(last_search == NULL失败)中看出这一点,那么您可能遇到的问题比可读性更大。

于 2012-09-17T15:32:38.980 回答
1

不仅短路评估使其不可读,而且还使用了多余的比较。

if ( !last_search || total_results)

比您建议的任何内容都更容易阅读。

于 2012-09-17T15:37:20.083 回答