清晰的邏輯判斷可以避免遺漏和重複。更重要的是,明確的判別True和False可以增加執行效率。

最近正在閱讀「程序員的數學」(結城浩 著)由人民郵電出版社發行簡中版本。

唸到邏輯這章突然對於程式邏輯判斷上有新體悟與更細膩的了解。我本身為電子背景出身,其實數位邏輯就不斷在使用AND、OR、NOT。但學生時期多半為了考試,並沒有好好思考邏輯判斷之間帶給整個流程與系統的影響。

現在,每天都在產出程式碼,立即能夠連結相關應用並得到改善,今天就利用C++

Logical operators探討兩個操作符號,可以如何改善程式碼架構:&&、||

先讓我們來熱身一下,做點頭腦體操:

#include <iostream>

bool True() {
    std::cout << "True" << std::endl;
    return true;
}

bool False() {
    std::cout << "False" << std::endl;
    return false;
}

int main(int argc, char* argv[]) {
    if (False() && True())
        std::cout << "F && T" << std::endl;  // False

    std::cout << "===" << std::endl;

    if (True() && False())
        std::cout << "T && F" << std::endl;  // False

    std::cout << "===" << std::endl;

    if (False() || True())
        std::cout << "F || T" << std::endl;  // False
                                             // True
                                             // F || T

    std::cout << "===" << std::endl;

    if (True() || False())
        std::cout << "T || F" << std::endl;  // True
                                             // T || F

    return 0;
}

在撰寫判斷邏輯架構會利用各種Flags透過if去切換不同的流程。今天如果能夠充分運用邏輯判斷:

  1. 可以少寫程式碼邏輯分支,看起來更乾淨。
  2. 可以減少執行指令,尤其是function call所產生的call stack的指令成本,更不用說你還要執行Function內的流程。

從上面的sample可以發現到:

When using the logical operators, C++ only evaluates what is necessary from left to right to come up with the combined relational result, ignoring the rest.

其實教材很多,在這邊引用cplusplus上的教學。

引用:http://www.cplusplus.com/doc/tutorial/operators/

當&&(AND)從左至右執行必須先得到一個True才會執行右邊的Function。

而當||(OR)先從左邊得到True那麼就不需要再執行右邊的判斷。

所以,你知道了這個特性,你要怎麼改善程式架構?

&& (AND)等價程式碼

if (A())
    if (B())
        std::cout << "PASSED" << std::endl;

// equal
if (A() && B())
    std::cout << "PASSED" << std::endl;

|| (OR)等價程式碼

if (A())
    std::cout << "PASSED" << std::endl;
else
    if (B())
        std::cout << "PASSED" << std::endl;

// equal
if (A() || B())
    std::cout << "PASSED" << std::endl;

也就是說,當你在使用邏輯判斷時,左右順序是非常重要的,若忽略順序,將會浪費不必要的指令執行成本,當然!編譯器最佳化有可能會幫忙你改善這種浪費,但避免解Bug時還要排除最佳化,就先從觀念改善,從實作中控制。

以上,看似入門就該要知道的觀念,但往往這種小地方最容易被忽略,也最容易被改善。共勉之囉。