程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言入門知識 >> C語言基本教程 第5課:語句和表達式

C語言基本教程 第5課:語句和表達式

編輯:C語言入門知識

從這一課開始,終於可以愉快地編碼了.

C語言是一種編程語言,就像其他語言一樣,也是一句一句的表達.

C語言習慣用小寫字母,大小寫敏感,不使用行號,無程序行概念,可使用空行和空格,常用鋸齒形書寫格式.

 

\

 

 

int main(int argc, char *argv[] )
{
    int  i=0,j=0,sum=0;
    sum=10;
    for(i=1; i<10;i++)
    {
    	for(j=1;j<10;j++)
        {
        	sum+=i*j ;
        }
    }
    printf(“%d\n”,sum);
    return 0;
}
?C語言結構特點   ?程序由一個或多個函數組成 ?必須有且只能有一個主函數main(),可以放在程序中任一位置 ?程序執行從main開始,在main中結束,其它函數通過嵌套調用得以執行。   ?C程序由語句組成 ?用“;”作為語句終止符 ?注釋 ?/* */為注釋,不能嵌套,不產生編譯代碼 ======================================================== 在C語言中,共有三大常用的程序結構:
順序結構:代碼從前往後執行,沒有任何“拐彎抹角”;選擇結構:也叫分支結構,重點要掌握 if else、switch 以及條件運算符;循環結構:重復執行同一段代碼。   順序結構

<一> 空語句

只有分號“;”組成的語句稱為空語句。 空語句是什麼也不執行的語句。在程序中空語句可用來作空循環體。

適用的場合是語法上要求出現一個完整的語句,但並不需要執行任何任務的情況.

<二> 表達式語句

賦值語句是由賦值表達式再加上分號構成的表達式語句。其一般形式為: 變量=表達式; 賦值語句的功能和特點都與

賦值表達式相同。

int a=3;//變量定義並初始化

a=100;//賦值語句,將變量a賦值為100

以上都是順序結構,也就是說代碼一句一句自上而下開始執行.

選擇結構:

\

if 和 else 是兩個新的關鍵字,if 意為“如果”,else 意為“否則”,用來對條件進行判斷,並根據判斷結果執行不同的語句。總結起來,if else 的結構為:

if(判斷條件){
語句塊1
}else{
語句塊2
}

意思是,如果判斷條件成立,那麼執行語句塊1,否則執行語句塊2 。其執行過程可表示為下圖:
\

所謂語句塊(Statement Block),就是由{ }包圍的一個或多個語句的集合。如果語句塊中只有一個語句,也可以省略{ },例如:

  1. if(age>=18) printf("恭喜,你已經成年!\n");
  2. else printf("抱歉,你還未成年!\n");

由於if else 語句可以根據不同的情況執行不同的代碼,所以也叫分支結構或選擇結構,上面的代碼中,就有兩個分支。

求兩個數中的較大值:

  1. #include
  2. int main()
  3. {
  4. int a, b, max;
  5. printf("輸入兩個整數:");
  6. scanf("%d %d", &a, &b);
  7. if(a>b) max=a;
  8. else max=b;
  9. printf("%d和%d的較大值是:%d\n", a, b, max);
  10. return 0;
  11. }
運行結果:
輸入兩個整數:34 28↙
34和28的較大值是:34

本例中借助變量max,用max來保存較大的值,最後將max輸出。

只使用if語句

有的時候,我們需要在滿足某種條件時進行一些操作,而不滿足條件時就不進行任何操作,這個時候我們可以只使用 if 語句。也就是說,if else 不必同時出現。

單獨使用 if 語句的形式為:

if(判斷條件){
語句塊
}

意思是,如果判斷條件成立就執行語句塊,否則直接跳過。其執行過程可表示為下圖:
\

只使用 if 語句來求兩個數中的較大值:

  1. #include
  2. int main()
  3. {
  4. int a, b, max;
  5. printf("輸入兩個整數:");
  6. scanf("%d %d", &a, &b);
  7. max=b; // 假設b最大
  8. if(a>b) max=a; // 如果a>b,那麼更改max的值
  9. printf("%d和%d的較大值是:%d\n", a, b, max);
  10. return 0;
  11. }
運行結果:
輸入兩個整數:34 28
34和28的較大值是:34

本例程序中,輸入兩個數a、b。把b先賦予變量max,再用 if 語句判別max和b的大小,如max小於b,則把b賦予max。因此max中總是大數,最後輸出max的值。

多個if else語句

if else 語句也可以多個同時使用,構成多個分支,形式如下:

if(判斷條件1){
語句塊1
}else if(判斷條件2){
語句塊2
}else if(判斷條件3){
語句塊3
}else if(判斷條件m){
語句塊m
}else{
語句塊n
}

意思是,從上到下依次檢測判斷條件,當某個判斷條件成立時,則執行其對應的語句塊,然後跳到整個 if else 語句之外繼續執行其他代碼。如果所有判斷條件都不成立,則執行語句塊n,然後繼續執行後續代碼。

也就是說,一旦遇到能夠成立的判斷條件,則不再執行其他的語句塊,所以最終只能有一個語句塊被執行。

例如,使用多個 if else 語句判斷輸入的字符的類別:

  1. #include
  2. int main(){
  3. char c;
  4. printf("Input a character:");
  5. c=getchar();
  6. if(c<32)
  7. printf("This is a control character\n");
  8. else if(c>='0'&&c<='9')
  9. printf("This is a digit\n");
  10. else if(c>='A'&&c<='Z')
  11. printf("This is a capital letter\n");
  12. else if(c>='a'&&c<='z')
  13. printf("This is a small letter\n");
  14. else
  15. printf("This is an other character\n");
  16. return 0;
  17. }
運行結果:
Input a character:e↙
This is a small letter

本例要求判別鍵盤輸入字符的類別。可以根據輸入字符的ASCII碼來判別類型。由ASCII碼表可知ASCII值小於32的為控制字符。在“0”和“9”之間的為數字,在“A”和“Z”之間為大寫字母, 在“a”和“z”之間為小寫字母,其余則為其它字符。這是一個多分支選擇的問題,用多個 if else 語句編程,判斷輸入字符ASCII碼所在的范圍,分別給出不同的輸出。例如輸入為“e”,輸出顯示它為小寫字符。

在使用 if 語句時還應注意以下兩點:

在 if 語句中,判斷條件必須用括號括起來。語句塊由{ }包圍,但要注意的是在}之後不需要再加分號;(當然加上也沒錯)。

if語句的嵌套

if 語句也可以嵌套使用,例如:

運行結果:
Input two numbers:12 68
a
if 語句嵌套時,要注意 if 和 else 的配對問題。C語言規定,else 總是與它前面最近的 if 配對,例如:

  1. if(a!=b) // ①
  2. if(a>b) printf("a>b\n"); // ②
  3. else printf("a ③和②配對,而不是和①配對。

C語言雖然沒有限制 if else 能夠處理的分支數量,但當分支過多時,用 if else 處理會不太方便,而且容易出現 if else 配對出錯的情況。例如,輸入一個整數,輸出該整數對應的星期幾的英文表示:


  1. #include
  2. int main(){
  3. int a;
  4. printf("Input integer number:");
  5. scanf("%d",&a);
  6. if(a==1){
  7. printf("Monday\n");
  8. }else if(a==2){
  9. printf("Tuesday\n");
  10. }else if(a==3){
  11. printf("Wednesday\n");
  12. }else if(a==4){
  13. printf("Thursday\n");
  14. }else if(a==5){
  15. printf("Friday\n");
  16. }else if(a==6){
  17. printf("Saturday\n");
  18. }else if(a==7){
  19. printf("Sunday\n");
  20. }else{
  21. printf("error\n");
  22. }
  23. return 0;
  24. }
運行結果:
Input integer number:3↙
Wednesday

對於這種情況,實際開發中一般使用 switch 語句代替,請看下面的代碼:

  1. #include
  2. int main(){
  3. int a;
  4. printf("Input integer number:");
  5. scanf("%d",&a);
  6. switch(a){
  7. case 1: printf("Monday\n"); break;
  8. case 2: printf("Tuesday\n"); break;
  9. case 3: printf("Wednesday\n"); break;
  10. case 4: printf("Thursday\n"); break;
  11. case 5: printf("Friday\n"); break;
  12. case 6: printf("Saturday\n"); break;
  13. case 7: printf("Sunday\n"); break;
  14. default:printf("error\n"); break;
  15. }
  16. return 0;
  17. }
運行結果:
Input integer number:4↙
Thursday

switch是另外一種選擇結構的語句,用來代替簡單的、擁有多個分枝的 if else 語句,基本格式如下:

 

switch(表達式){
case 整型數值1: 語句 1;
case 整型數值2: 語句 2;
......
case 整型數值n: 語句 n;
default: 語句 n+1;
}

它的執行過程是:
1) 首先計算“表達式”的值,假設為 m。

2) 從第一個 case 開始,比較“整型數值1”和 m,如果它們相等,就執行冒號後面的所有語句,也就是從“語句1”一直執行到“語句n+1”,而不管後面的 case 是否匹配成功。

3) 如果“整型數值1”和 m 不相等,就跳過冒號後面的“語句1”,繼續比較第二個 case、第三個 case……一旦發現和某個整型數值相等了,就會執行後面所有的語句。假設 m 和“整型數值5”相等,那麼就會從“語句5”一直執行到“語句n+1”。

4) 如果直到最後一個“整型數值n”都沒有找到相等的值,那麼就執行 default 後的“語句 n+1”。

需要重點強調的是,當和某個整型數值匹配成功後,會執行該分支以及後面所有分支的語句。例如:

  1. #include
  2. int main(){
  3. int a;
  4. printf("Input integer number:");
  5. scanf("%d",&a);
  6. switch(a){
  7. case 1: printf("Monday\n");
  8. case 2: printf("Tuesday\n");
  9. case 3: printf("Wednesday\n");
  10. case 4: printf("Thursday\n");
  11. case 5: printf("Friday\n");
  12. case 6: printf("Saturday\n");
  13. case 7: printf("Sunday\n");
  14. default:printf("error\n");
  15. }
  16. return 0;
  17. }
運行結果:
Input integer number:4↙
Thursday
Friday
Saturday
Sunday
error

輸入4,發現和第四個分支匹配成功,於是就執行第四個分支以及後面的所有分支。這顯然不是我們想要的結果,我們希望只執行第四個分支,而跳過後面的其他分支。為了達到這個目標,必須要在每個分支最後添加break;語句。

break是C語言中的一個關鍵字,專門用於跳出 switch 語句。所謂“跳出”,是指一旦遇到 break,就不再執行 switch 中的任何語句,包括當前分支中的語句和其他分支中的語句;也就是說,整個 switch 執行結束了,接著會執行整個 switch 後面的代碼。

使用 break 修改上面的代碼:

  1. #include
  2. int main(){
  3. int a;
  4. printf("Input integer number:");
  5. scanf("%d",&a);
  6. switch(a){
  7. case 1: printf("Monday\n"); break;
  8. case 2: printf("Tuesday\n"); break;
  9. case 3: printf("Wednesday\n"); break;
  10. case 4: printf("Thursday\n"); break;
  11. case 5: printf("Friday\n"); break;
  12. case 6: printf("Saturday\n"); break;
  13. case 7: printf("Sunday\n"); break;
  14. default:printf("error\n"); break;
  15. }
  16. return 0;
  17. }
運行結果:
Input integer number:4↙
Thursday

由於 default 是最後一個分支,匹配後不會再執行其他分支,所以也可以不添加break;語句。

最後需要說明的兩點是:
1) case 後面必須是一個整數,或者是結果為整數的表達式,但不能包含任何變量。請看下面的例子:

  1. case 10: printf("..."); break; //正確
  2. case 8+9: printf("..."); break; //正確
  3. case 'A': printf("..."); break; //正確,字符和整數可以相互轉換
  4. case 'A'+19: printf("..."); break; //正確,字符和整數可以相互轉換
  5. case 9.5: printf("..."); break; //錯誤,不能為小數
  6. case a: printf("..."); break; //錯誤,不能包含變量
  7. case a+10: printf("..."); break; //錯誤,不能包含變量

2) default 不是必須的。當沒有 default 時,如果所有 case 都匹配失敗,那麼就什麼都不執行。

 

在上邊例子中,if 的判斷條件中使用了<=、>、!=等符號,它們專門用在判斷條件中,讓程序決定下一步的操作,稱為關系運算符(Relational Operators)。

關系運算符在使用時,它的的兩邊都會有一個表達式,比如變量、數值、加減乘除運算等,關系運算符的作用就是判明這兩個表達式的大小關系。注意,是判明大小關系,不是其他關系。

C語言提供了以下關系運算符:

關系運算符 含 義 數學中的表示 < 小於 < <= 小於或等於 > 大於 > >= 大於或等於 == 等於 = != 不等於
關系運算符都是雙目運算符,其結合性均為左結合。關系運算符的優先級低於算術運算符,高於賦值運算符。在六個關系運算符中,<、<=、>、>=的優先級相同,高於==和!=,==和!=的優先級相同。

在C語言中,有的運算符有兩個操作數,例如 10+20,10和20都是操作數,+ 是運算符。我們將這樣的運算符稱為雙目運算符。同理,將有一個操作數的運算符稱為單目運算符,將有三個操作數的運算符稱為三目運算符。

常見的雙目運算符有 +、-、*、/ 等,單目運算符有 ++、-- 等,三目運算符只有一個,就是 ? :,

關系運算符的兩邊可以是變量、數據或表達式,例如:
1) a+b > c-d
2) x > 3/2
3) 'a'+1 < c
4) -i-5*j == k+1

關系運算符也可以嵌套使用,例如:
1) a > (b > c)
2) a != (c == d)

關系運算符的運算結果只有 0 或 1。當條件成立時結果為 1,條件不成立結果為 0。例如:

5>0 成立,其值為1;34-12>100 不成立,其值為 0;(a=3)>(b=5) 由於3>5不成立,故其值為0。
我們將運算結果 1 稱為“真”,表示條件成立,將 0 稱為“假”,表示條件不成立。

下面的代碼會將關系運算符的結果輸出:

運行結果:
1, 0
1, 1
0, 0

對於含多個關系運算符的表達式,如 k==j==i+5,根據運算符的左結合性,先計算k==j,該式不成立,其值為0,再計算0==i+5,也不成立,故表達式值為0。

需要提醒的是,==才表示等於,而=表示賦值,大家要注意區分,切勿混淆。

&&是一個新的運算符,稱為邏輯運算符,表示age>=18和score>=60兩個條件必須同時成立才能執行 if 後面的代碼,否則就執行 else 後面的代碼。

在高中數學中,我們就學過邏輯運算,例如p為真命題,q為假命題,那麼“p且q”為假,“p或q”為真,“非q”為真。在C語言中,也有類似的邏輯運算:

運算符 說明 結合性 舉例 && 與運算,雙目,對應數學中的“且” 左結合 1&&0、(9>3)&&(b>a) || 或運算,雙目,對應數學中的“或” 左結合 1||0、(9>3)||(b>a) ! 非運算,單目,對應數學中的“非” 右結合 !a、!(2<5)

 

邏輯運算的結果

在編程中,我們一般將零值稱為“假”,將非零值稱為“真”。邏輯運算的結果也只有“真”和“假”,“真”對應的值為 1,“假”對應的值為 0。

1) 與運算(&&)

參與運算的兩個表達式都為真時,結果才為真,否則為假。例如:

 

5&&0

5為真,0為假,相與的結果為假,也就是 0。

(5>0) && (4>2)

5>0 的結果是1,為真,4>2結果是1,也為真,所以相與的結果為真,也就是1。

2) 或運算(||)

參與運算的兩個表達式只要有一個為真,結果就為真;兩個表達式都為假時結果才為假。例如:

10 || 0

10為真,0為假,相或的結果為真,也就是 1。

(5>0) || (5>8)

5>0 的結果是1,為真,5>8 的結果是0,為假,所以相或的結果為真,也就是1。

3) 非運算(!)

參與運算的表達式為真時,結果為假;參與運算的表達式為假時,結果為真。例如:

!0

0 為假,非運算的結果為真,也就是 1。

!(5>0)

5>0 的結果是1,為真,非運算的結果為假,也就是 0。

邏輯運算符和其它運算符優先級從低到高依次為:

賦值運算符(=) < &&和|| < 關系運算符 < 算術運算符 < 非(!)

&& 和 || 低於關系運算符,! 高於算術運算符。

按照運算符的優先順序可以得出:

  1. #include
  2. int main(){
  3. char c='k';
  4. int i=1, j=2, k=3;
  5. float x=3e+5, y=0.85;
  6. int result_1 = 'a'+5 printf( "%d, %d\n", result_1, -i-2*j>=k+1 );
  7. printf( "%d, %d\n", 1 printf( "%d, %d\n", i+j+k==-2*j, k==j==i+5 );
  8. return 0;
  9. }
a>b && c>d 等價於 (a>b)&&(c>d)!b==c||dc&&x+yc)&&((x+y) 另外,邏輯表達式也可以嵌套使用,例如a>b && b || 9>c,a || c>d && !p

 

循環結構

所謂循環(Loop),就是重復地執行同一段代碼,例如要計算 1+2+3+……+99+100 的值,就要重復進行99次加法運算。

while循環

while循環的一般形式為:

 

while(表達式){
語句塊
}

意思是,先計算“表達式”的值,當值為真(非0)時, 執行“語句塊”;執行完“語句塊”,再次計算表達式的值,如果為真,繼續執行“語句塊”……這個過程會一直重復,直到表達式的值為假(0),就退出循環,執行 while 後面的代碼。

我們通常將“表達式”稱為循環條件,把“語句塊”稱為循環體,整個循環的過程就是不停判斷循環條件、並執行循環體代碼的過程。

用 while 循環計算1加到100的值:

  1. #include
  2. int main(){
  3. int i=1, sum=0;
  4. while(i<=100){
  5. sum+=i;
  6. i++;
  7. }
  8. printf("%d\n",sum);
  9. return 0;
  10. }
運行結果:
5050

代碼分析:
1) 程序運行到 while 時,因為 i=1,i<=100 成立,所以會執行循環體;執行結束後 i 的值變為 2,sum 的值變為 1。

2) 接下來會繼續判斷 i<=100是否成立,因為此時 i=2,i<=100 成立,所以繼續執行循環體;執行結束後 i 的值變為 3,sum 的值變為3。

3) 重復執行步驟 2)。

4) 當循環進行到第100次,i 的值變為 101,sum 的值變為5050;因為此時 i<=100 不再成立,所以就退出循環,不再執行循環體,轉而執行while循環後面的代碼。

while 循環的整體思路是這樣的:設置一個帶有變量的循環條件,也即一個帶有變量的表達式;在循環體中額外添加一條語句,讓它能夠改變循環條件中變量的值。這樣,隨著循環的不斷執行,循環條件中變量的值也會不斷變化,終有一個時刻,循環條件不再成立,整個循環就結束了。

如果循環條件中不包含變量,會發生什麼情況呢?

1) 循環條件成立時的話,while 循環會一直執行下去,永不結束,成為“死循環”。例如:

  1. #include
  2. int main(){
  3. while(1){
  4. printf("1");
  5. }
  6. return 0;
  7. }
運行程序,會不停地輸出“1”,直到用戶強制關閉。

2) 循環條件不成立的話,while 循環就一次也不會執行。例如:

  1. #include
  2. int main(){
  3. while(0){
  4. printf("1");
  5. }
  6. return 0;
  7. }
運行程序,什麼也不會輸出。

再看一個例子,統計從鍵盤輸入的一行字符的個數:

  1. #include
  2. int main(){
  3. int n=0;
  4. printf("Input a string:");
  5. while(getchar()!='\n') n++;
  6. printf("Number of characters: %d\n", n);
  7. return 0;
  8. }
運行結果:
Input a string:c.biancheng.net↙
Number of characters: 15

本例程序中的循環條件為getchar()!='\n',其意義是,只要從鍵盤輸入的字符不是回車就繼續循環。循環體n++;完成對輸入字符個數計數。

do-while循環

除了while循環,在C語言中還有一種 do-while 循環。

do-while循環的一般形式為:

do{
語句塊
}while(表達式);

do-while循環與while循環的不同在於:它會先執行“語句塊”,然後再判斷表達式是否為真,如果為真則繼續循環;如果為假,則終止循環。因此,do-while 循環至少要執行一次“語句塊”。

用do-while計算1加到100的值:

  1. #include
  2. int main(){
  3. int i=1, sum=0;
  4. do{
  5. sum+=i;
  6. i++;
  7. }while(i<=100);
  8. printf("%d\n", sum);
  9. return 0;
  10. }
運行結果:
5050
注意while(i<=100);最後的分號;,這個必須要有。
while循環和do-while各有特點,大家可以適當選擇,實際編程中使用while循環較多。

除了while循環,C語言中還有for循環,它的使用更加靈活,完全可以取代 while 循環。

上節我們使用 while 循環來計算1加到100的值,代碼如下:


  1. #include
  2. int main(){
  3. int i, sum=0;
  4. i = 1; //語句①
  5. while(i<=100 /*語句②*/ ){
  6. sum+=i;
  7. i++; //語句③
  8. }
  9. printf("%d\n",sum);
  10. return 0;
  11. }
可以看到,語句①②③被放到了不同的地方,代碼結構較為松散。為了讓程序更加緊湊,可以使用 for 循環來代替,如下所示:

  1. #include
  2. int main(){
  3. int i, sum=0;
  4. for(i=1/*語句①*/; i<=100/*語句②*/; i++/*語句③*/){
  5. sum+=i;
  6. }
  7. printf("%d\n",sum);
  8. return 0;
  9. }
在 for 循環中,語句①②③被集中到了一起,代碼結構一目了然。

for 循環的一般形式為:

 

for(表達式1; 表達式2; 表達式3){
語句塊
}

它的運行過程為:
1) 先執行“表達式1”。
2) 再執行“表達式2”,如果它的值為真(非0),則執行循環體,否則結束循環。
3) 執行完循環體後再執行“表達式3”。
4) 重復執行步驟 2) 和 3),直到“表達式2”的值為假,就結束循環。

上面的步驟中,2) 和 3) 是循環條件,會重復判斷

“表達式1”僅在第一次循環時執行,以後都不會再執行,可以認為這是一個初始化語句。“表達式2”一般是一個關系表達式,決定了是否還要繼續下次循環,稱為“循環條件”。“表達式3”很多情況下是一個帶有自增或自減操作的表達式,以使循環條件逐漸變得“不成立”。

for循環的執行過程可用下圖表示:
\

我們再來分析一下“計算從1加到100的和”的代碼:

  1. #include
  2. int main(){
  3. int i, sum=0;
  4. for(i=1; i<=100; i++){
  5. sum+=i;
  6. }
  7. printf("%d\n",sum);
  8. return 0;
  9. }
運行結果:
5050

代碼分析:
1) 執行到 for 語句時,先給 i 賦初值1,判斷 i<=100 是否成立;因為此時 i=1,i<=100 成立,所以執行循環體。循環體執行結束後(sum的值為1),再計算 i++。

2) 第二次循環時,i 的值為2,i<=100 成立,繼續執行循環體。循環體執行結束後(sum的值為3),再計算 i++。

3) 重復執行步驟 2),直到第101次循環,此時 i 的值為101,i<=100 不成立,所以結束循環。

由此我們可以總結出for循環的一般形式:

for(初始化語句; 循環條件; 自增或自減){
語句塊
}

for 循環中的三個表達式

for 循環中的“表達式1(初始化條件)”、“表達式2(循環條件)”和“表達式3(自增或自減)”都是可選項,都可以省略(但分號;必須保留)。

1) 修改“從1加到100的和”的代碼,省略“表達式1(初始化條件)”:

  1. int main(){
  2. int i = 1, sum = 0;
  3. for( ; i<=100; i++){
  4. sum+=i;
  5. }
可以看到,將i=1移到了 for 循環的外面。

2) 省略了“表達式2(循環條件)”,如果不做其它處理就會成為死循環。例如:

  1. for(i=1; ; i++) sum=sum+i;
相當於:

  1. i=1;
  2. while(1){
  3. sum=sum+i;
  4. i++;
  5. }
所謂死循環,就是循環條件永遠成立,循環會一直進行下去,永不結束。死循環對程序的危害很大,一定要避免。

3) 省略了“表達式3(自增或自減)”,就不會修改“表達式2(循環條件)”中的變量,這時可在循環體中加入修改變量的語句。例如:

  1. for( i=1; i<=100; ){
  2. sum=sum+i;
  3. i++;
  4. }

4) 省略了“表達式1(初始化語句)”和“表達式3(自增或自減)”。例如:

  1. for( ; i<=100 ; ){
  2. sum=sum+i;
  3. i++;
  4. }
相當於:

  1. while(i<=100){
  2. sum=sum+i;
  3. i++;
  4. }

5) 3個表達式可以同時省略。例如:

for( ; ; ) 語句

相當於:

while(1) 語句


6) “表達式1”可以是初始化語句,也可以是其他語句。例如:

  1. for( sum=0; i<=100; i++ ) sum=sum+i;

7) “表達式1”和“表達式3”可以是一個簡單表達式也可以是逗號表達式。

  1. for( sum=0,i=1; i<=100; i++ ) sum=sum+i;
或:

  1. for( i=0,j=100; i<=100; i++,j-- ) k=i+j;

8) “表達式2”一般是關系表達式或邏輯表達式,但也可是數值或字符,只要其值非零,就執行循環體。例如:

  1. for( i=0; (c=getchar())!='\n'; i+=c );
又如:

  1. for( ; (c=getchar())!='\n' ; )
  2. printf("%c",c);
使用while或for循環時,如果想提前結束循環(在不滿足結束條件的情況下結束循環),可以使用break或continue關鍵字。

break關鍵字

當 break 關鍵字用於 while、for 循環時,會終止循環而執行整個循環語句後面的代碼。

使用 while 循環計算1加到100的值:

  1. #include
  2. int main(){
  3. int i=1, sum=0;
  4. while(1){ //循環條件為死循環
  5. sum+=i;
  6. i++;
  7. if(i>100) break;
  8. }
  9. printf("%d\n", sum);
  10. return 0;
  11. }
運行結果:
5050

while 循環條件為 1,是一個死循環。當執行到第100次循環的時候,計算完i++;後 i 的值為 101,此時 if 語句的條件 i> 100 成立,執行break;語句,結束循環。

在多層循環中,一個 break 語句只向外跳一層。例如,輸出一個4*4的整數矩陣:

  1. #include
  2. int main(){
  3. int i=1, j;
  4. while(1){ // 外層循環
  5. j=1;
  6. while(1){ // 內層循環
  7. printf("%-4d", i*j);
  8. j++;
  9. if(j>4) break; //跳出內層循環
  10. }
  11. printf("\n");
  12. i++;
  13. if(i>4) break; // 跳出外層循環
  14. }
  15.  
  16. return 0;
  17. }
運行結果:
1   2   3   4
2   4   6   8
3   6   9   12
4   8   12  16
當 j>4 成立時,執行break;,跳出內層循環;外層循環依然執行,直到 i>4 成立,跳出外層循環。內層循環共執行了4次,外層循環共執行了1次。

continue語句

continue 語句的作用是跳過循環體中剩余的語句而強制進入下一次循環。continue語句只用在 while、for 循環中,常與 if 條件語句一起使用,判斷條件是否成立。

來看一個例子:

  1. #include
  2. int main(){
  3. char c = 0;
  4. while(c!='\n'){ //回車鍵結束循環
  5. c=getchar();
  6. if(c=='4' || c=='5'){ //按下的是數字鍵4或5
  7. continue; //跳過當次循環,進入下次循環
  8. }
  9. putchar(c);
  10. }
  11. return 0;
  12. }
運行結果:
0123456789↙
01236789

程序遇到while時,變量c的值為'\0',循環條件c!='\n'成立,開始第一次循環。getchar() 使程序暫停執行,等待用戶輸入,直到用戶按下回車鍵才開始讀取字符。

本例我們輸入的是 0123456789,當讀取到4或5時,if 的條件c=='4'||c=='5'成立,就執行 continue 語句,結束當前循環,直接進入下一次循環,也就是說putchar(c);不會被執行到。而讀取到其他數字時,if 的條件不成立,continue 語句不會被執行到,putchar(c);就會輸出讀取到的字符。

break與continue的對比:break 用來結束所有循環,循環語句不再有執行的機會;continue 用來結束本次循環,直接跳到下一次循環,如果循環條件成立,還會繼續循環。

 

goto 語句, 好多人都是主張慎用,禁用的,這裡就不講了,基本上也用不到.


  1. #include
  2. int main(){
  3. int a,b;
  4. printf("Input two numbers:");
  5. scanf("%d %d",&a,&b);
  6. if(a!=b){ //!=表示不等於
  7. if(a>b) printf("a>b\n");
  8. else printf("a }else{
  9. printf("a=b\n");
  10. }
  11. return 0;
  12. }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved