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)