K&R2心得//控制流程

翻譯問題
標籤(label)→位標

定義:
指述(statement):任何句子加上分號(;)。
區段(block):使用大括弧{}將一群指述夾起來,並視為一道指述。




判斷語法
請養成使用大括弧的好習慣,有助於避免掉不必要的bug。

if(運算式A)

    指述    //運算式A = = 1時執行
else
    指述

單一決策,二選一


if(運算式A)
    指述    //運算式A = = 1
else if(運算式B)
    指述    //運算式B = = 1
else
    指述    //上面的運算式都不成立時,執行它,若無此行,則當作沒執行過if-else...
多種決策,多次判斷(由上而下依序),只執行單一指述。
(成立其中一項就執行其中一項,執行完就結束整串)

switch(運算式)
{
    case 常數(運算式結果):
        指述
    case 常數(運算式結果):
        指述
    default:       //上面的常數都不等於運算式結果時,執行它,若無此行,則當作沒執行過switch-case...
        指述
}
多種決策,一次判斷,決定開始執行的位置(可執行多個指述,falling through特性)。←不常見寫法
若限定執行單一指述,在指述最後加入break; ←常見寫法

switch-case語法,可執行多個指述寫法,用於兩種可能性,有相同的指述。

迴圈語法

while和for差在哪?
一般用法:一般(有初始化、判斷句、控制運算)的情況,while和for的選擇,完全依個人喜好而定。
但是...
在只有判斷句的情況下,使用while顯得比較好讀
相對的
在三句都有的情況之下,使用for顯得比較好讀

把不相關的運算式寫在for的括弧內是不好(但是沒有不對)的習慣。

特別用法:

while(1){} 和 for(;;){} 一樣 都是無窮迴圈,只能使用break;跳出!= =+

特別中的特別用法:(,)的用法
for( i = 0 , j = 0 ; i < 0 ; i++, j++ )
1. 初始化的動作包括 i 和 j,控制運算的動作包括 i 和 j
2. 巨集定義個運算式需包括很多計算時(還沒看過例子)
3. 指述的簡潔寫法
    c = s [ i ];
    s [ i ] = s [ j ];
    s [ j ] = c ;
        變成
    c = s [ i ], s [ i ] = s [ j ], s [ j ] = c ;

用逗號隔開的運算式是由左而右依序運算,且將最後的值及資料型態作為整個運算式的值和資料型態。

while和for的運算順序,在第一章(C語言概述)有介紹過,如下。
P.1-8
while(a>b){    printf("33333");    }
意思是
if(a>b){     printf("33333");    }
if(a>b){     printf("33333");    }

....(做好幾次)

P.1-14
for(i=0;i<100;i++){    printf("33333");    }
意思是
i=0;    //只有一次
if(i<100){    printf("33333");    }
i++;  //在大括弧外,使用break;或continu;時跳出大括弧,卻還會執行它
if(i<100){    printf("33333");    }
i++;
...(做好幾次)



和do-while不一樣

do{    printf("33333");    
}while(a>b)
意思是
printf("33333");      //先做一次,再執行判斷
if(a>b){     printf("33333");    }
....(做好幾次)
先做一次,再判斷是否要重複

break和continue(注意!不常用,別拼錯了)
break;     停止這一層的迴圈或case,執行迴圈或case之後的指述。
continue; 停止這一層的迴圈,       再執行迴圈(也會執行控制運算i++)。(case不用此語法)
continue; 一定配合if,通常放在一群複雜指述之前,而該群指述是否執行取決該if的判斷。(其實看人寫啦!不一定)

goto        停止很多層的回圈或case(break和continu所辦不到的功能)
但比較不易閱讀也不易維護。
任何包含goto的程式都可以改寫為沒有goto的寫法,只是可能要宣告不少額變數來控制。

沒有留言:

張貼留言

(什麼是留言欄訊息?)