K&R2心得//控制流程
¶K&R2心得//控制流程
原文連結: https://darkblack01.blogspot.com/2011/03/k_3582.html
移植時的最後更新日期: 2015-12-23T14:16:57.707+08:00
翻譯問題
標籤(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的寫法,只是可能要宣告不少額變數來控制。