【零基礎學習iOS開發】【02-C語言】09-流程式控制制

來源:互聯網
上載者:User

標籤:

本文目錄
  • 前言
  • 一、順序結構
  • 二、選擇結構1-if語句
  • 三、選擇結構2-switch語句
  • 四、迴圈結構1-while迴圈
  • 五、迴圈結構2-do while迴圈
  • 六、迴圈結構3-for迴圈
  • 七、break和continue
回到頂部前言1.預設的運行流程

預設情況下,程式的運行流程是這樣的:運行程式後,系統會按書寫順序執行程式中的每一行代碼。比如下面的程式

 1 #include <stdio.h> 2  3 int main() 4 { 5      6     printf("Hello-1\n"); 7     printf("Hello-2\n"); 8     printf("Hello-3\n"); 9     10     return 0;11 }

程式運行後,會按順序執行第6、7、8行語句,於是輸出結果為:

 

2.其他運行流程

但很多時候,我們並不想要按照預設的運行流程去走,比如想在某個條件成立的情況下才執行某一段代碼,否則不執行。比如的這個介面:

如果使用者點擊了註冊按鈕,我們就執行“跳轉到註冊介面”的代碼;如果使用者點擊了登入按鈕,我們就執行“跳轉到登入介面”的代碼。如果使用者沒做出任何操作,就不執行前面所說的兩段代碼。要想實現這種功能,那就要學會如何去控製程序的運行流程。

 

3.流程結構

為了方便我們控製程序的運行流程,C語言提供3種流程結構,不同的流程結構可以實現不同的運行流程。這3種流程結構分別是:

  • 順序結構:預設的流程結構。按照書寫順序執行每一條語句。
  • 選擇結構:對給定的條件進行判斷,再根據判斷結果來決定執行哪一段代碼。
  • 迴圈結構:在給定條件成立的情況下,反覆執行某一段代碼。

下面是這3種結構的流程圖,大致預覽一下即可

 

回到頂部一、順序結構

順序結構是3種結構中最簡單的,也是預設的流程結構:程式中的語句是按照書寫順序執行的。在文章開頭開始列出的程式碼片段,就是順序結構,這裡就不多介紹了。

 

回到頂部二、選擇結構1-if語句

C語言中選擇結構的實現方式有兩種:if語句和switch語句。先來看下if語句的使用,而if語句的形式是有好多種的。

1.形式1

先來看看if語句最簡單的形式

1> 簡介
1 if ( 條件 )2 {3     語句1;4     語句2;5     ....6 }

如果if右邊小括弧()中的條件成立,也就是為“真”時,就會執行第2~6行大括弧{}中的語句;如果條件為假,就不執行大括弧{}中的語句。這裡的if是關鍵字。

2> 舉例
1 int a = 7;2 3 if ( a )4 {5     printf("條件a成立\n");6     printf("a的值為真");7 }

C語言規定所有非0值都為“真”,而a的值是7,因此第3行的條件是成立的,接著就會執行第5、6行代碼。輸出結果如下:

1 條件a成立2 a的值為真

如果將a的值改為0,那麼第3行的條件就不成立,就不會執行第5、6行代碼

3> 省略大括弧{}

如果if後面大括弧{}中只有一行代碼時,可以省略大括弧。形式如下:

if ( 條件 )    語句1;

注意:如果條件成立,只會執行if後面的第1條語句;如果條件不成立,就不會執行if後面的第1條語句。

1 int a = 7;2 3 if ( a > 9 )4     printf("aaa");5     printf("bbb");

因為第3行的a>9是不成立的,所以不會執行第4行代碼。而第5行代碼跟if語句是沒有任何練習的,因此,第5行代碼照常執行。於是會看到螢幕上只輸出:。

由於第5行代碼跟if語句是沒有任何聯絡的,所以一般會把代碼寫成下面這樣:

1 int a = 7;2 3 if ( a > 9 )4     printf("aaa");5 printf("bbb");

為了保證代碼的可讀性,不建議省略大括弧!!!

4> 語句嵌套

if語句內部是可以嵌套其他if語句的,如下面的例子

 1 int a = 7; 2  3 if ( a > 0 ) 4 { 5     printf("a的值大於0\n"); 6      7     if ( a<9 ) 8     { 9         printf("a的值小於9");10     }11 }

第3行的a>0是成立的,因此會按順序執行第4~11大括弧中的代碼。執行到第7行的時候,a<9也是成立的,因此會執行第9行代碼。輸出結果:

1 a的值大於02 a的值小於9
5> 使用注意1

有些人習慣寫完一行代碼就在後面加個分號";",於是寫if語句的時候,他們可能會這樣寫:

1 int a = 6;2 if ( a>8 );3 {4     printf("a大於8");5 }

如果第2行尾部的分號,其實一個分號也是一條語句,這個叫做“空語句”。第2行的a>8不成立,所以不會執行後面的“空語句”。而後面的大括弧{}跟if語句是沒有聯絡的,因此會正常執行,於是會看到輸出:

a大於8

所以要非常小心,千萬不要在if的小括弧後面添加分號。

第3~5行的內容是一個獨立的“代碼塊”:

1 {2     printf("a大於8");3 }
6> 使用注意2

下面的寫法從文法的角度看是對的:

int a = 10;if (a = 0) {    printf("條件成立");} else {    printf("條件不成立");}

上述代碼是完全合理的,編譯器不會報錯,只是個警告而已。因為a為0,所以為"假",輸出結果是:"條件不成立"

這裡隱藏著很大的陷阱在:

假設你本來是想判斷a是否為0,那麼本應該寫if (a == 0),若你誤寫成了if (a = 0),那將是一件非常可怕的事情,因為編譯器又不報錯,這樣的BUG就難找了。因此,像a==0這樣的運算式,最好寫成0==a,若你誤寫成0=a,編譯器會直接報錯的。

// 不推薦if (a == 0) {}// 推薦if (0 == a) {}
7> 使用注意3

在C語言中,可以不儲存關係運算的結果。因此,下面的寫法是合法的:

1 int a = 10;2 a > 10;3 a == 0;

這裡又是一個陷阱,假設你的本意是想給a賦值為0,那麼本應該寫a = 0; ,若你誤寫成a == 0; ,那將又是一個非常難找的BUG,因為編譯器根本不會報錯。在1993年的時候,這個BUG差點讓一樁價值2000萬美元的硬體產品生意告吹,因為如果這個BUG不解決,這個產品就沒辦法正常使用

 

2.形式2

if還可以跟關鍵字else一起使用

1> 簡介
1 if ( 條件 )2 {3     語句1;4 }5 else6 {7     語句2;8 }

如果條件成立,就會執行if後面大括弧{}中的語句;如果條件不成立,就會執行else後面大括弧{}中的語句。總之,兩個大括弧中一定會有1個被執行,而且只能執行的1個。

為了減少程式碼數,你也可以寫成下面的格式:

1 if ( 條件 ) {2     語句1;3 } else {4     語句2;5 }

當然,也可以省略大括弧,寫成下面的格式:

1 if ( 條件 )2     語句1;3 else4     語句2;

如果條件成立,就執行if後面的第1條語句;如果條件不成立,就執行else後面的第1條語句。但還是不建議省略大括弧{}。

2> 舉例
1 int a = 10;2 if ( a==0 ) {3     printf("a等於0");4 } else {5     printf("a不等於0");6 }

第2行的a==0不成立,所以會執行第5行代碼,輸出結果:

a不等於0

 

3.形式3

if和else還有一種比較複雜的用法

1> 簡介
 1 if ( 條件1 ) 2 { 3     語句1; 4 } 5 else if ( 條件2 ) 6 { 7     語句2; 8 } 9 else if ( 條件3 )10 {11     語句3;12 }13 ...14 else15 {16     其他語句;17 }
  • 如果條件1成立,就執行條件1後面大括弧{}中的內容:第2~4行
  • 如果條件1不成立,條件2成立,就執行條件2後面大括弧{}中的內容:第6~8行
  • 如果條件1、條件2都不成立,條件3成立,就執行條件3後面大括弧{}中的內容:第10~12行
  • 第13行的...表示可以有無限個else if
  • 如果所有的條件都不成立,就會執行else後面大括弧{}中的內容:第15~17行

注意:這麼多大括弧中,只有1個大括弧內的代碼會被執行。跟之前一樣,所有的大括弧都可以省略,但是不建議省略。必要的時候,最後面的else那一段(第14~17行)是可以省略的。

2> 舉例
1 int a = 10;2 if ( a==0 ) {3     printf("a等於0");4 } else if( a>0 ) {5     printf("a大於0");6 } else {7     printf("a小於0");8 }

第2行中的a==0不成立,接著會檢查第4行。第4行的a>0成立,因此會執行第5行代碼。輸出結果:

a大於0

如果a的值是負數,那麼第2、4行的條件都不成立,於是就會執行第7行代碼。

 

回到頂部三、選擇結構2-switch語句1.形式

先來看看switch語句的使用形式:

 1 switch(整型運算式) 2 { 3     case 數值1: 4         語句1; 5         break; 6     case 數值2: 7         語句2; 8         break; 9     ... ...10     case 數值n:11         語句n;12         break;13     default :14         語句n+1;15         break;16 }
  • 當整型運算式的值等於“數值1”時,就會執行“語句1”,後面的break表示退出整個switch語句,也就是直接跳到第16行代碼;
  • 當整形運算式的值等於“數值2”時,就會執行“語句2”;後面的以此類推。如果在數值1~數值n中,沒有一個值等於整型運算式的值,那麼就會執行default中的語句n+1。
  • 由於所有的case後面都有個break,因此執行完任意一個case中的語句後,都會直接退出switch語句

 

2.舉例
 1 int a = 10; 2  3 switch (a) { 4     case 0: 5         printf("這是一個0"); 6         break; 7     case 5: 8         printf("這是一個5"); 9         break;10     case 10:11         printf("這是一個10");12         break;13     default:14         printf("什麼也不是");15         break;16 }

因為a的值剛好等於第10行case後面的10,所以會執行第11行代碼,輸出結果:

這是一個10

 

3.break

break關鍵字的作用是退出整個switch語句。預設的格式中,每個case後面都有個break,因此執行完case中的語句後,就會退出switch語句。

1> 如果某個case後面沒有break,意味著執行完這個case中的語句後,會按順序執行後面所有case和default中的語句,直到遇到break為止

 1 int a = 0; 2  3 switch (a) { 4     case 0: 5         printf("這是一個0\n"); 6     case 5: 7         printf("這是一個5\n"); 8     case 10: 9         printf("這是一個10\n");10         break;11     default:12         printf("什麼也不是\n");13         break;14 }
  • 由於變數a的值等於第4行case後面的0,因此肯定會執行第5行代碼。
  • 由於case 0中沒有break語句,就不會退出switch語句,繼續往下執行代碼。
  • 由於a的值已經等於第4行case的值,接著不會再判斷a的值是否等於其他case的值了,直接按順序執行第7、9行代碼。在第10行有個break,接著就會退出switch語句。
  • 輸出結果為:
1 這是一個02 這是一個53 這是一個10

如果把a的值改為5,輸出結果為:

1 這是一個52 這是一個10

 

2> 在某些時候,我們確實沒有必要在每一個case後面添加break。下面舉一個例子:判斷分數的優良中差等級(100分滿分)。

 1 int score = 77; 2  3 switch (score/10) { 4     case 10: 5     case 9: 6         printf("優秀"); 7         break; 8          9     case 8:10         printf("良好");11         break;12         13     case 7:14     case 6:15         printf("中等");16         break;17         18     default:19         printf("差勁");20         break;21 }
  • 當score的範圍是90~100,score/10的值為10或9時,就會執行第6行代碼,然後退出switch語句;
  • 當score的範圍是80~89,score/10的值為8時,就會執行第10行代碼,然後退出switch語句;
  • 當score的範圍是60~79,score/10的值為7或6時,就會執行第15行代碼,然後退出switch語句;
  • 當score的範圍並不是60~100,score/10的值並不在6~10範圍內時,就會執行第19行代碼,然後退出switch語句;
  • score的值是77,所以score/10的值是7,輸出結果:中等

 

4.在case中定義變數

有時候,我們可能會想在case中定義一些變數,這個時候,就必須用大括弧{}括住case中的所有語句。

 1 int a = 10; 2 int b = 4; 3  4 char op = ‘-‘; 5  6 switch (op) 7 { 8     case ‘+‘: 9     {10         int sum = a + b;11         printf("a+b=%d\n", sum);12         break;13     }14         15     case ‘-‘:16     {17         int minus = a - b;18         printf("a-b=%d\n", minus);19         break;20     }21         22     default:23         printf("不能識別的符號");24         break;25 }

在第10、17分別定義兩個變數。輸出結果:

a-b=6

 

回到頂部四、迴圈結構1-while迴圈

假如要你在螢幕上重複輸出10次Hello World,你會怎麼做?簡單,把下面的代碼拷貝10份就行了。

1 printf("Hello World\n");

沒錯,把上次代碼寫10遍,確實能實現功能。但是這樣的代碼太垃圾了,有很多的重複的代碼,這樣會使得代碼非常地臃腫,複用率低。因此,不建議這麼做。

下次遇到像上面那樣重複執行某個操作時,首先要想到的應該是迴圈結構。所謂迴圈,就是重複執行某一個操作,C語言中有多種方式可以實現迴圈結構。先來看看while迴圈。

1.形式
1 while ( 條件 )2 {3     語句1;4     語句2;5     ....6 }
  • 如果條件成立,就會執行迴圈體中的語句(“迴圈體”就是while後面大括弧{}中的內容)。然後再次判斷條件,重複上述過程,直到條件不成立就結束while迴圈
  • while迴圈的特點:如果while中的條件一開始就不成立,那麼迴圈體中的語句永遠不會被執行

可以省略大括弧{},但是只會影響到while後面的第一條語句。不建議省略大括弧。

1 while ( 條件 )2     語句1;

 

2.舉例

在螢幕上重複輸出10次Hello World,每輸出一次的換行。

1 int count = 0;2 while ( count < 10 )3 {4     printf("Hello World\n");5    6     count++;7 }

如果省略第6行的count++,count就一直是0,那麼count<10一直都是成立的,這個while迴圈將會陷入“死迴圈”,一直在重複執行第4行代碼。

 

3.注意

如果寫成下面這樣,也會讓程式進入“死迴圈”

1 int count = 0;2 3 while ( count < 10 );4 {5     printf("Hello World\n");6     7     count++;8 }
  • 注意第3行,while後面不小心加了個分號; ,一個分號表示一條空語句。
  • 可以看出:while迴圈只會影響到第3行的空語句,而第4~8行的代碼塊是不受while迴圈影響的
  • 由於count是0,那麼count<10一直都是成立的,程式將會一直重複執行第3行的空語句,陷入死迴圈。

 

回到頂部五、迴圈結構2-do while迴圈

形式如下:

1 do {2     語句1;3     語句2;4     ...5 } while (條件);
  • 注意第5行,後面是加上一個分號;的
  • 當執行到do-while迴圈時,首先會執行一遍迴圈體中的語句(“迴圈體”就是do後面大括弧{}中的內容)。接著判斷while中的條件,如果條件成立,就執行迴圈體中的語句。然後再次判斷條件,重複上述過程,直到條件不成立就結束while迴圈
  • do-while迴圈的特點:不管while中的條件是否成立,迴圈體中的語句至少會被執行一遍
  • 其實do while迴圈的用法跟while迴圈是差不多的,這裡就不舉例子了。

 

回到頂部六、迴圈結構3-for迴圈1.形式

 for迴圈是所有迴圈結構中最複雜的。

1 for (語句1; 條件; 語句2) {2     語句3;3     語句4;4     ...5 }
  • for迴圈開始時,會先執行語句1,而且在整個迴圈過程中只執行一次語句1
  • 接著判斷條件,如果條件成立,就會執行迴圈體中的語句(“迴圈體”就是for後面大括弧{}中的內容)
  • 迴圈體執行完畢後,接下來會執行語句2,然後再次判斷條件,重複上述過程,直到條件不成立就結束for迴圈

 

2.舉例
1 for (int i = 0; i<5; i++)2 {3     printf("%d  ", i);4 }

輸出結果為:

0  1  2  3  4  

需要注意的是:變數i的範圍是第1~4行。一旦離開了這個for迴圈,變數i就失效了。

 

3.補充

如果for迴圈的初始化語句和迴圈一次後執行的語句是由多條語句組成的,就用逗號,隔開

1 for (int x = 0, y =0; x<3; x++, y+=2)2 {3     printf("x=%d, y=%d \n", x, y);4 }

輸出結果:

x=0, y=0 x=1, y=2 x=2, y=4 

 

回到頂部七、break和continue

接下來,介紹兩個比較重要的語句:break和continue。

1.break

前面在switch語句中已經用到了break,它的作用是跳出switch語句。它也可以用在迴圈結構中,這時候它的作用是跳出整個迴圈語句。

1> 舉例

這裡以for迴圈為例子,break也可以用在while迴圈、do-while迴圈中。

1 for (int i = 0; i<5; i++) {2     printf("i=%d \n", i);3     4     if (i>2) {5         break;6     }7 }

上面代碼的意思是當i>2時,就跳出整個for迴圈,也就是結束for迴圈,所以輸出結果是:

i=0 i=1 i=2 i=3 

 

2> for迴圈嵌套

先來看一個for迴圈嵌套的例子,嵌套的意思就是:for迴圈內部又一個for迴圈

1 for (int x = 0; x<2; x++) {2     for (int y = 0; y<2; y++) {3         printf("x=%d, y=%d \n", x, y);4     }5 }

輸出結果是:

1 x=0, y=0 2 x=0, y=1 3 x=1, y=0 4 x=1, y=1 

 

這個時候如果在for迴圈中加入一個break,那麼這個break究竟是跳出裡面還是外面的for迴圈呢?

1 for (int x = 0; x<2; x++) {2     for (int y = 0; y<2; y++) {3         printf("x=%d, y=%d \n", x, y);4         5         break;6     }7 }

注意第5行的break,這個break的作用是跳出裡面的for迴圈,並非外面的for迴圈。所以輸出結果是:

x=0, y=0 x=1, y=0 

 

如果改變一下break的位置

1 for (int x = 0; x<2; x++) {2     for (int y = 0; y<2; y++) {3         printf("x=%d, y=%d \n", x, y);4     }5     6     break;7 }

注意第6行的break,這個break的作用是跳出外面的for迴圈,並非裡面的for迴圈。所以輸出結果是:

x=0, y=0 x=0, y=1 

規律已經很明顯了:break只會影響它所在的那個for迴圈

 

2.continue

continue只能使用在迴圈結構中,它的作用是跳過這一次迴圈,直接進入下一次迴圈。

這裡以for迴圈為例子,continue也可以用在while迴圈、do-while迴圈中。

1 for (int x = 0; x<10; x++) {2     if (x%2==0) {3         continue;4     }5     6     printf("x=%d \n", x);7 }

注意第2行,當x%2==0,也就是當x是2的倍數時,就跳過這次迴圈,不執行第6行語句,直接進入下一次迴圈。輸出結果:

1 x=1 2 x=3 3 x=5 4 x=7 5 x=9 

跟break一樣,continue只會影響它所在的那個for迴圈

    

【零基礎學習iOS開發】【02-C語言】09-流程式控制制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.