清晰的邏輯判斷可以避免遺漏和重複。更重要的是,明確的判別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去切換不同的流程。今天如果能夠充分運用邏輯判斷:
從上面的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上的教學。
當&&(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時還要排除最佳化,就先從觀念改善,從實作中控制。
以上,看似入門就該要知道的觀念,但往往這種小地方最容易被忽略,也最容易被改善。共勉之囉。