周立功:分解條件語句,讓表達更清晰——邏輯表達式

2020-12-13 電子工程世界網

表達式是單個或多個相聯的計算單個值語句當用於比較時表達式,會返回bool布爾數據類型true(真)或false(假)。假設編寫了如下函數:

bool isEven(int value);

// 前置條件:若且唯若value為偶數時,函數返回真


對於編譯器來說,表達式返回任何非0的整數為true,返回0為false。比如:


能執行if語句函數體中的所有代碼,而語句:


便會不執行函數體中的所有代碼。於是就可以在代碼中使用isEven()函數,以顯示數字奇偶的信息。比如:

if(isEven(j)) 

       // j是even

else 

       // j是odd


簡單地說,代碼中的表達式越長,越難以理解。而條件邏輯是最容易出錯的地方,下面將介紹幾種可以用於簡化的重構技術。其核心是分解條件語句,將一個條件語句拆分為多個部分。這種能力是非常重要的,因為它能夠將跳轉邏輯和具體發生的細節區分開來。


>>>> 1.1.1   邏輯表達式


邏輯非!只有一個輸入,如果輸入為true,那麼返回false;如果輸入為false,則返回true。比如,非true結果為false,非false結果為true,零之外的任何數字的非值都為false。


如果兩個輸入值都為true,那麼邏輯與&&返回true(即第一個值與第二個值都為true),任何非零數字與false進行邏輯與返回false。因此不要認為&&用於判斷兩個數是否相等,而是用於判斷兩個參數是否為true。


如果第一個表達式是布爾型且返回false,那麼第二個表達式將不會計算,這就是短路求值。短路運算很有用,你可以寫出若且唯若第一個條件為true時,才判斷第二個條件的表達式。比如:


當運行到if語句時,程序首先會判斷x是不是0,如果是0,便直接跳過,不會判斷第二個條件。如果沒有短路,則不得不這樣寫:

if(x !=0) 

       if(10 /x < 2)


使用短路運算,可以寫出清晰的代碼。


如果兩個值都為true或其中一個為true,邏輯或(||)返回true。和邏輯與一樣,邏輯或也可以進行短路計算,如果第一個條件為true,便不會檢查第二個。


實際上,日常用語和數學邏輯表達有時相悖的,當「!、!=、&&和||」一起出現時,很容易引起混淆。當說起某某情況不為真時,則要用到!或!=。比如,value不等於2或3:

if( value != 2 || value !=3 )


如果從數學觀點考察這個條件測試,則會發現只要value不等於2或value不等於3,if測試中的表達式均為true,而實際上卻是錯誤的。正確的理解是,只要不滿足value為2或3,if語句的條件測試就通過:

if( !(value == 2 || value == 3) )


但這條語句還不夠直觀,因為真正想測試的是value不等於2「與」value不等於3,則這個測試可以修改為:

if( value != 2 && value != 3 )


因為對於任何邏輯表達式p和q,按照摩根定律,以下關係恆成立:


!(a || b || c) == (!a)&& (!b) && (!c)


!(a && b && c) ==(!a) || (!b) || (!c)


一般來說,熟練的程式設計師會忽略括號,因為關係運算符(、>=)的優先級比邏輯運算符(&&和||)更高,但加了括號會將意圖描述得更清楚。在混合使用互相無關的運算符時,多寫幾個括號是個很好的習慣,畢竟代碼是寫給別人看的。因為C語言存在優先級的陷阱,導致程式設計師很容易犯錯誤。由於邏輯運算符的約束力比賦值運算符強,因此在大部分混合使用的表達式中,括號是必須的。比如:

while((c = getchar()) != EOF)


如果混合使用了字位運算和關係運算符,由於字位運算符(&和|)的優先級低於關係運算符(比如,==),因此不管出現在哪裡,都必須在表達式裡加上括號。即:



相關焦點

  • 學習C,必知的表達式用法
    =>=,<=關係表達式的運算結果為bool類型布爾類型只有兩個值,一個是true,一個是falseC#中的邏輯表達式:&&邏輯與||邏輯或!邏輯非表達式1&&表達式2注意:表達式1和表達式2必須是能夠求解成bool類型的表達式(邏輯與用於運算兩個布爾類型);邏輯運算的結果也是布爾類型表達式1表達式2表達式1&&表達式2,&&的結果才為true,否則為false所以&&一般用於表達兩個表達式同時成立邏輯或||表達式1||表達式2舉例:
  • Python智闡4-條件判斷語句和循環語句
    1、條件判斷語句條件判斷語句格式主要有以下幾種:邏輯:當出現條件判斷語句時,先進行 if 後麵條件判斷,如果結果為真,就執行對應的執行語句(退出整個條件判斷語句),否則就執行 else 對應的執行語句(退出整個條件判斷語句)或者執行 elif 的條件判斷,邏輯同if-else。
  • 51單片機之C語言-4.5基本語句之條件選擇語句
    條件選擇語句之if語句本文引用地址:http://www.eepw.com.cn/article/201611/319554.htm前面我們講了數據類型,運算符及表達式。C語言也是一種語言,既然是語言,一定有連接詞。這些連接詞可以用來表示假設,循環等等。我們先來看看假設if語句。
  • PHP就業快學課程004,基本語法「條件控制語句」!
    執行順序為:開始---語句1---語句2---語句N---結束。選擇分支結構對給定的條件進行判斷,條件為真時執行一個分支,條件為假時執行別一個分支。前面所學的if…else 語句在處理多分支情況下,使用比較麻煩繁瑣,分析不太清晰。
  • 程式設計師必備 || 學習Java流程控制「條件語句中『簡單的if條件語句...
    條件語句包括if條件語句與switch多分支語句。本篇我將向大家介紹條件語句的用法。2.1.if條件語句if條件語句是一個重要的編程語句,用於告訴程序在某個條件成立的情況下執行某段語句,而在另一種情況下執行另外的語句。
  • 《金字塔原理》:讓你的表達更清晰
    我很理解小劉的痛苦,人在職場,不是光會做事就行了,我們還必須學會表達,無論口頭或者文案。在這方面,最為經典、實用的方法,當屬芭芭拉·明託在《金字塔原理》一書中提到的結構化思維。因為這樣對王總和李總都更方便,劉總也能參加,並且本周只有這一天會議室還沒有被預訂。」上述第二段文字,就是一個簡單的金字塔結構。大家可以發現,重新組織的語句形成了兩個層次,第一句提問屬於第一層,而後面的語句都屬於第二層,第二層是用來解釋第一層問題的。如此表述,語意就非常明確。
  • Python學習筆記:條件語句if、elif與else
    請放心食用~條件語句的運行邏輯為:如果條件被滿足(返回真值),可以做某件事情;如果條件不滿足(返回假值),就做另一件事情,或什麼也不做。通過圖1,可以對條件語句的運行機製作簡單的了解。表 1 if-else語句常用的參數及說明參數說明條件表達式接受布爾表達式。表示判斷條件是否成立。無默認值操作語句接受操作語句。表示執行一段代碼。無默認值if-else語句執行時,程序首先判斷if部分條件的真假。
  • Python中的IF條件判斷語句
    # if條件判斷:if根據提供的條件進行判定,如果為真,則執行if後面的語句,反之不執行# if作為基本的流程判斷單元,使程序更靈活# Python 中的 if else 語句可以細分為三種形式,分別是
  • 單片機c語言教程:C51複合語句和條件語句
    讀完前面的文章大家都會大概對條件語句這個概念有所認識吧?是的,就如學習語文中 的條件語句一樣,C 語言也一樣是「如果 XX 就 XX」或是「如果 XX 就 XX 不然 XX」。也就是 當條件符合時就執行語句。
  • 《金字塔原理》讓邏輯變得更清晰,表達更輕鬆
    很多時候我們表達的東西,別說別人能不能理解,自己都不知道是怎麼一回事。這都是因為邏輯思路不清晰的關係。//疑問那麼怎麼才能讓邏輯變得清晰,讓自己說清楚,別人聽明白呢?//答案這就要說到我看的這本書《金字塔原理》了。
  • Verilog HDL基礎之:條件語句
    >if(表達式1) 語句1;else if(表達式2) 語句2;else if(表達式3) 語句3;...關於if語句有如下6點說明:(1)3種形式的if語句中,在if後面都有「表達式」,一般為邏輯表達式或關係表達式。
  • Python條件判斷語句詳解:if、else、switch都有了
    if語句用於檢測某個條件是否成立。如果成立,則執行if語句內的程序;否則,跳過if語句,執行後面的內容。if語句的格式如下。if(表達式):     語句1 else:     語句2if語句的執行過程如下:如果表達式的布爾值為真,則執行語句1;否則,執行語句2。其中的else子句可以省略,表達式兩側的括號也可以省略。
  • 阿里JAVA開發強制要求的10條條件控制及邏輯判斷的規範,切記
    return obj;}// 接著寫else的業務邏輯代碼;說明:如果非得使用if()...else if()...else...方式表達邏輯,【強制】避免後續代碼維護困難,請勿超過3層。正例:超過3層的 if-else 的邏輯判斷代碼可以使用衛語句、策略模式、狀態模式等來實現,其中衛語句示例如下:5. 【推薦】除常用方法(如getXxx/isXxx)等外,不要在條件判斷中執行其它複雜的語句,將複雜邏輯判斷的結果賦值給一個有意義的布爾變量名,以提高可讀性。
  • Python語言教程算術運算與算術表達式的介紹
    Python語言教程算術運算與算術表達式的介紹 Python語言教程在算術運算符與算術的表達方式是我們值得學習的知識。下面我們就來詳細的看看Python語言教程中的相關信息。
  • Javascript之if條件語句和三目運算符
    一、if條件語句1、語法:if( condition ) statement1 else statement2;註:A、condition是條件,statement是需要執行的循環語句。B、當condition的條件滿足時,執行statement1語句,不滿足時,執行statement2語句。C、我們也可以不書寫else語句,只書寫前半部分語句,但是那樣的話如果條件不滿足,那麼statement語句永遠也不會執行。
  • C語言while語句與do-while語句
    一、while語句1.一般形式while(表達式)語句;(1)表達式代表循環條件(2)語句是循環體2.執行流程當循環條件成立的情況下重複執行循環體語句,循環條件不成立時循環結束3.注意的問題(1)while關鍵字後邊的表達式通常是關係表達式或者邏輯表達式(2)如果循環體語句不止一條,
  • [GO語言基礎] 五.順序控制語句和條件控制語句(if、else、switch)
    前文介紹了Golang的運算,包括算術運算、邏輯運算、賦值運算、位運算及編程練習。這篇文章將詳細講解順序控制語句和條件控制語句。這系列文章入門部分將參考「尚矽谷」韓順平老師的視頻和書籍《GO高級編程》,詳見參考文獻,並結合作者多年的編程經驗進行學習和豐富,且看且珍惜!
  • 零基礎學VBA編程第11課:什麼是IF分支語句?
    在實際If語句使用過程中,我們更普遍使用塊形式的If語句,這是由於相比於單行形式,塊形式更加靈活,能夠容納更多的表達式,代碼結構更加清晰,更有利於代碼的編寫和閱讀(潛臺詞:如果你覺得記兩種形式比較麻煩,可以暫時忘記單行形式)。舉個例子。
  • 六個基本邏輯,讓你表達清晰有結構
    優秀的人從來不會輸在表達上,會邏輯表達,讓你的客戶、你的同事、你的老闆心服口服,讓你在職場中所向披靡。羅振宇說過:職場,或者說當代社會,最重要的能力就是表達能力。兩個能力相當的人,誰的表達更好,就會在職場中佔據競爭優勢,就更能得到上升的機會。
  • 程式設計師必備 || 學習Java流程控制「條件語句中『if…else語句...
    >if…else語句是條件語句中最常用的以種形式,它會針對某種條件有選擇的做出處理。通常表現為「如果滿足某種條件,就進行某種處理,否則就進行另一種處理」。語法如下;if(表達式){若干語句如果表達式的值為true,則執行緊跟if語句的複合語句,如果表達式的值為false,則執行else後面的複合語句。同樣簡單的if條件語句一樣,如果if…else語句的語句序列中只有一條語句(不包括注釋),則可以省略該語句序列外面的「{ }」。