看似簡單的if-else

條件語句if-else是在編程時最常見的語句,我們對它們是相當熟悉。本人上學時還鬧出一個笑話,可能是自己耳朵有問題或是老師教的有問題,一直把else讀爲:安賴死,看似簡單的if-else以至於在做項目交流的時候,嘴巴冒出這個發音時,幾個哥們兒笑的人仰馬翻,不閒扯了,說正題。

往往最簡單的東西,卻有着很多意想不到的技巧和陷阱,
本人總結了三點平時寫程序時遇到的問題和建議,希望能夠對大家有所幫助。

1. 符號執行問題:
下面這兩種風格,哪種更好呢?
if(a == 1)
{
    語句;
}

if(1 == a)
{
    語句;
}
顯然後者更好,爲什麼呢?這是爲了防止寫程序時,漏掉一個“=”號;這個時候,編譯器是不會提示錯誤的,導致比較語句變成了賦值語句,從而永遠執行語句;而後者如果少了一個“=”號,編譯器會提示出錯,這就是符號執行的好處。

2. if-else匹配問題:
if(1 == a);
fun(1);
這個時候,fun()函數不管條件正不正確,始終被調用;原因是if(1 == a)後面有一個“;”號,表示一條空語句,也就是:
if(1 == a)
{}
fun(1);
我們在寫程序的時候,不建議省略“{}”,哪怕是空語句或者一條語句;
另外,不建議用下面這種編碼風格:
if( 1 == a){
語句;
}
else{
語句;
}
我們更傾向於這種風格:
if(1 == a)
{
   語句;
}
else
{
   語句;
}

3. if-else語句執行問題:
我們知道,在if-else構成的語句中,如果if後條件正確,else分支將會被跳過,多個if-else語句的執行情況也是一樣的;從而我們更傾向於把正常情況放在if條件中,這樣會省去不必要的條件判斷,提高程序執行效率。
在專業的白盒測試中,有一個關於分支和語句的通過指標,當且僅當一個函數的所有語句和分支的覆蓋率都達到100%時,才認爲程序的結構設計是通過的,這樣能夠保證排除條件的矛盾性;什麼叫語句?什麼叫分支呢?例如:
if(A && B && C)
{
    a = 0;
}
else
{
    a = 1;
}
兩個{}之間的部分叫做語句,條件A && B && C叫做分支;語句的用例設計可以分爲兩種就可以全部覆蓋,而分支卻不是;我們要讓條件的每個分支A,B,C都各爲一次真和假,即:1 and 0,才能夠說每個分支都檢查了一遍,即組合布爾形式爲:

1 && 1 && 1;
1 && 1 && 0;
1 && 0;
0 && ;

當條件遇到0時,後面語句將不被檢查,直接跳到else語句中,這樣我們發現如果是假的時候,有三種情況,這就需要三個測試用例來跑這一個條件中的各個分支。這些知識是在白盒測試中常見的內容,我們在設計程序的時候,一定要避免分支的相互矛盾,這個就爲程序員帶了更高的要求。

 

最後,補充一個關於switch語句的問題:

switch語句中的case a:

a可以是0.1,-0.2,3/2,變量i(假設i已經被賦值爲1)嗎?可以是'A','a'嗎?

前面的一組情況不允許,後面的一組情況是可以的。

總結:在switch語句中,case後面只能是整形或者字符型的常量或者常量表達式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章