C語言:敘述

空敘述(null statement)
表示式敘述(expression statement)
區塊敘述(block statement)
所謂區塊,就是一堆按照從上到下執行順序的敘述(statement)。C語言的區塊格式:
{
敘述1;
敘述2;
敘述3;

}

整個區塊可以當作是單一敘述來使用。區塊常用在函數定義,控制流程等。
條件(condition)
C語言沒有規定一定要比較式(如==<>)及邏輯連接詞(如及&&,或||,否!等)才能當判斷條件。C語言規定任何表示式(expression)的值(value)可以轉換成整數0的話,都當作偽(false);任何表示式的值可以轉換成非0整數的話,都當作真(true)。例如x+y可以當作判斷條件,如果x+y是0,就是偽,如果x+y不是0,就是真。
if-else敘述(if-else statement)
任何程式語言都有條件式(conditional)。C語言並不例外,條件式的格式是:
if (表示式)
敘述;

上面的程式碼表示:
如果表示式是真,就執行敘述;
如果表示式是偽,則不執行任何敘述。
有時候你希望條件成立時執行某個敘述,條件不成立時執行另一個敘述:
if (表示式)
敘述1;
else
敘述2;

上面的程式碼表示:
如果表示式是真,就執行敘述1;
如果表示式是偽,就執行敘述2。
別忘了,敘述1或2都可以換成區塊。例如:
if (表示式)
{
敘述;
敘述;
敘述;

}
else
{
敘述;
敘述;
敘述;

}

有時候會出現兩個以上的if緊跟著一個else,這時候else的判斷條件到底是上面的if,還是下面的if
if (表示式1)
if (表示式2)
敘述1
else
敘述2;

C語言規定(和多數語言一樣):else總是跟最接近的if。換句話說,上面的else的判斷條件是表示式2,不是表示式1。
上面的程式碼表示:
只有在表示式1為真而且表示式2也為真,才會執行敘述1;
只有在表示式1為真而且表示式2為偽,才會執行敘述2;
如果敘述1為偽,則不執行任何敘述。
如果要else跟著上面的if,必須在下面的if外面加個{},讓它變成區塊:
if (表示式1)
{
if (表示式2)
敘述1
}
else
敘述2;

上面的程式碼表示:
只有在表示式1為真而且表示式2也為真,才會執行敘述1;
如果敘述1為偽,則執行敘述2;
表示式1為真而且表示式2為偽,則不執行任何敘述。
switc敘述(switch statement)
大多數語言都有多重選擇(multiple selection)。C語言並不例外,多重選擇的格式是:
switch (表示式)
{
case 常數值1:
敘述1;
break;
case 常數值2:
敘述2;
break;
case 常數值3:
敘述3;
break;

default:
敘述;
break;
}

上面的程式碼表示:先求出表示式的值;
如果該值等於常數值1,就執行敘述1;
如果該值等於常數值2,就執行敘述2;
如果該值等於常數值3,就執行敘述3;
餘此類推;
如果都不等於,就執行敘述。
上面每個敘述都跟著的break敘述,這通常是必需的。因為如果不加break敘述,則執行完敘述後,將會執行下一個敘述。如上面的例子中,如果把敘述1下面的break敘述省略:
switch (表示式)
{
case 常數值1:
敘述1;
case 常數值2:
敘述2;
break;
case 常數值3:
敘述3;
break;

default:
敘述;
break;
}

則執行完敘述1後,將會執行敘述2。有時候程式邏輯需要這樣,但是一般很少出現這種特殊情形,所以通常別忘了加個break敘述。還有最下面的break敘述是不必要的。此外不加default:的話,如果都不等於任何常數值,則不執行任何敘述。這點常是程式錯誤(bug)的重要來源,不得不小心。還有每個常數值可以執行不只一個敘述,但是不用加{},這是因為每個敘述都已經放在區塊裡面了:
switch (表示式)
{
case 常數值1:
敘述1;
敘述2;
敘述3;
break;
case 常數值2:
敘述4;
break;
case 常數值3:
敘述5;
敘述6;
break;

default:
敘述;
break;
}

上面的程式碼表示:先求出表示式的值;
如果該值等於常數值1,就執行敘述1,2,3;
如果該值等於常數值2,就執行敘述4;
如果該值等於常數值3,就執行敘述5,6;
餘此類推;
如果都不等於,就執行敘述。
最後,不同的常數值可以執行相同的敘述:
switch (表示式)
{
case 常數值1:
case 常數值2:
敘述1;
敘述2;
敘述3;
break;
case 常數值3:
case 常數值4:
case 常數值5:
敘述4;
break;
case 常數值6:
敘述5;
敘述6;
break;

default:
敘述;
break;
}

上面的程式碼表示:先求出表示式的值;
如果該值等於常數值1,2,就執行敘述1,2,3;
如果該值等於常數值3,4,5,就執行敘述4;
如果該值等於常數值6,就執行敘述5,6;
餘此類推;
如果都不等於,就執行敘述。
while迴圈(while loop)
大多數語言都有while迴圈。C語言並不例外,while迴圈的格式是:
while (表示式)
敘述;

上面的程式碼表示:
如果表示式是真,就執行敘述;
再判斷表示式是否為真,如果表示式是真,就執行敘述;
再判斷表示式是否為真,如果表示式是真,就執行敘述;
如此一直判斷表示式是否為真,一直執行敘述,直到表示式為偽,就跳出迴圈不再執行。
如果一開始表示式為偽,則不執行任何敘述;換句話說,while迴圈可能執行0次。別忘了,敘述可以換成區塊。
do-while迴圈(do-while loop)
while迴圈可能執行0次,如果要讓迴圈至少執行1次,就必須使用do-while迴圈,格式是:
do
敘述;
while (表示式);

上面的程式碼表示:
先執行敘述;
再判斷表示式是否為真,如果表示式是真,就執行敘述;
再判斷表示式是否為真,如果表示式是真,就執行敘述;
如此一直判斷表示式是否為真,一直執行敘述,直到表示式為偽,就跳出迴圈不再執行。
換句話說,do-while迴圈至少執行1次。別忘了,敘述可以換成區塊。
for迴圈(for loop)
大多數語言都有for迴圈。C語言並不例外,for迴圈的格式是:
for (初始表示式; 條件表示式; 步驟表示式)
敘述;

C語言很奇怪,以上for迴圈等同於以下含有while迴圈的程式碼:
初始表示式;
while (條件表示式)
{
敘述;
步驟表示式;
}

例如以下for迴圈:
for (i=0; i<100; i++)
printf("%d\n",i);

等同於以下含有while迴圈的程式碼:
i=0;
while (i<100)
{
printf("%d\n",i);
i++;
}

上面的程式碼表示:
一開始指定i為0;
再判斷條件表示式i<100是否為真,結果條件表示式是真(0<100),就執行敘述printf("%d\n",i),列印出i為0,再將i加1(i變成1);
再判斷條件表示式i<100是否為真,結果條件表示式是真(1<100),就執行敘述printf("%d\n",i),列印出i為1,再將i加1(i變成2);
再判斷條件表示式i<100是否為真,結果條件表示式是真(2<100),就執行敘述printf("%d\n",i),列印出i為2,再將i加1(i變成3);
如此一直判斷條件表示式是否為真,一直執行敘述,一直執行步驟表示式,直到條件表示式為偽,i剛好等於100,就跳出迴圈不再執行。換句話說,上面程式碼是列印出0到99共100個整數。另外初始表示式可以是變數宣告,如int i=0
break敘述break statement)
continue敘述(continue statement)
標籤(label)
goto敘述(goto statement)
return敘述(return statement)