<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                本文目錄 - [前言](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#label0) - [一、順序結構](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#label1) - [二、選擇結構1-if語句](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#label2) - [三、選擇結構2-switch語句](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#label3) - [四、循環結構1-while循環](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#label4) - [五、循環結構2-do while循環](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#label5) - [六、循環結構3-for循環](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#label6) - [七、break和continue](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#label7) [回到頂部](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#labelTop) ### 前言 ### 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行語句,于是輸出結果為: ![](https://box.kancloud.cn/2016-05-07_572d76694ffcf.png) ### 2.其他運行流程 但很多時候,我們并不想要按照默認的運行流程去走,比如想在某個條件成立的情況下才執行某一段代碼,否則不執行。比如微信的這個界面: ![](https://box.kancloud.cn/2016-05-07_572d76675626c.png) 如果用戶點擊了注冊按鈕,我們就執行“跳轉到注冊界面”的代碼;如果用戶點擊了登錄按鈕,我們就執行“跳轉到登錄界面”的代碼。如果用戶沒做出任何操作,就不執行前面所說的兩段代碼。要想實現這種功能,那就要學會如何去控制程序的運行流程。 ### 3.流程結構 為了方便我們控制程序的運行流程,C語言提供3種流程結構,不同的流程結構可以實現不同的運行流程。這3種流程結構分別是: - 順序結構:默認的流程結構。按照書寫順序執行每一條語句。 - 選擇結構:對給定的條件進行判斷,再根據判斷結果來決定執行哪一段代碼。 - 循環結構:在給定條件成立的情況下,反復執行某一段代碼。 下面是這3種結構的流程圖,大致預覽一下即可 ![](https://box.kancloud.cn/2016-05-07_572d7669661f0.png) [回到頂部](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#labelTop) ### 一、順序結構 順序結構是3種結構中最簡單的,也是默認的流程結構:程序中的語句是按照書寫順序執行的。在[文章開頭](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#label0)開始列出的代碼段,就是順序結構,這里就不多介紹了。 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#labelTop) ### 二、選擇結構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行代碼照常執行。于是會看到屏幕上只輸出:![](https://box.kancloud.cn/2016-05-07_572d76697d308.png) 。 由于第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的值大于0 2 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 else 6 { 7 語句2; 8 } ~~~ 如果條件成立,就會執行if后面大括號{}中的語句;如果條件不成立,就會執行else后面大括號{}中的語句。總之,兩個大括號中一定會有1個被執行,而且只能執行的1個。 為了減少代碼行數,你也可以寫成下面的格式: ~~~ 1 if ( 條件 ) { 2 語句1; 3 } else { 4 語句2; 5 } ~~~ 當然,也可以省略大括號,寫成下面的格式: ~~~ 1 if ( 條件 ) 2 語句1; 3 else 4 語句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 else 15 { 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行代碼。 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#labelTop) ### 三、選擇結構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 這是一個0 2 這是一個5 3 這是一個10 ~~~ 如果把a的值改為5,輸出結果為: ~~~ 1 這是一個5 2 這是一個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 ~~~ [回到頂部](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#labelTop) ### 四、循環結構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行的空語句,陷入死循環。 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#labelTop) ### 五、循環結構2-do while循環 形式如下: ~~~ 1 do { 2 語句1; 3 語句2; 4 ... 5 } while (條件); ~~~ - 注意第5行,后面是加上一個分號;的 - 當執行到do-while循環時,首先會執行一遍循環體中的語句(“循環體”就是do后面大括號{}中的內容)。接著判斷while中的條件,如果條件成立,就執行循環體中的語句。然后再次判斷條件,重復上述過程,直到條件不成立就結束while循環 - do-while循環的特點:不管while中的條件是否成立,循環體中的語句至少會被執行一遍 - 其實do while循環的用法跟while循環是差不多的,這里就不舉例子了。 [回到頂部](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#labelTop) ### 六、循環結構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 ~~~ [回到頂部](http://www.cnblogs.com/mjios/archive/2013/06/07/3075946.html#labelTop) ### 七、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循環
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看