嵌入式linux學習筆記:02_C語言

前言:接下來篇文章主要來複習下C語言相關知識點!!堅持!

一、編輯C語言程序的工具

1、 在linux系統下編輯? ---- 使用vi編輯工具
首先使用vi指定文件的名字,通過模式切換對文件進行編輯。

1)在家目錄下指定一個新的文件名字叫test.c。
gec@ubuntu:~$ vi test.c

2)進入vi工具後,首先是"一般模式"。
一般模式的特點:不能夠對文本進行編輯,只能通過方向鍵查看文件內容。

3)按"i"鍵,切換到"編輯"模式。
編輯模式特點:在底行會出現一個字符串"-INSERT-",在該模式下,隨意編輯文本,但是不能夠保存文本!

4)想保存退出,只能先按"Esc"切換到一般模式,再按":"切換到底行模式。
w(write) -> 保存

q(quit) -> 退出

底行模式特點: 在底行出現一個":",可以保存退出文本!

練習:使用vi來編輯程序

#include <stdio.h>
int main()
{
       printf("helloworld!\n");
      return 0;
}

2、 在linux系統下編輯? — 使用gedit編輯工具
1)使用gedit指定一個文件的名字。
2)直接編輯,按退出即可!
3、 在windows系統下編輯? --> 使用notepad++編輯工具。
因爲在windows編輯完工程之後,需要將文件放置linux下處理,所以需要設置linux與windows的共享目錄。

1)確保共享目錄路徑在windows下存在。
D:\share

2)告訴linux,共享目錄在哪裏?
虛擬機 -> 設置 -> 選項 -> 共享文件夾 -> 總是啓用 -> 添加 -> 下一步 -> 瀏覽 -> 主機路徑:D:\share

–> 下一步 -> 完成 -> 確定

3)使用命令切換到共享目錄下路徑
cd /mnt/hgfs/

ls -> 看到share,說明共享成功!

ls -> 沒有看到任何,重啓虛擬機!

練習1: 成功設置共享目錄

練習2: 在02/code/test.c -> 編輯一下

練習3: 在linux與windows刪除/創建東西,另外一個系統還在不在!

結論: linux與windows是互通,在linux下操作共享目錄下內容,不需要sudo

思考題:
1)能不能在/mnt/hgfs下創建任何東西?

答案:不能,因爲這個目錄下的內容通過共享設置的,不是通過命令來創建!

2)能不能在共享目錄中創建?

答案:能,用戶隨意創建。

二、分析linux C語言大綱

1、main函數使用事項、基本數據類型、變量定義/賦值、生命週期作用域、運算符,程序編譯過程分析。
2、ASCII碼,語句/表達式,逗號表達式/三目運算,控制流循環與分支結構。
3、函數定義、調用、聲明、函數形式參數與實參之間關係,函數返回值,函數書寫規則,函數運行規則。
4、一些特殊函數調用:遞歸函數、回調函數、變參函數,內聯函數
5、數組定義/賦值,數組元素,一維數組、二維數組、整型數組、字符數組,指針數組。
6、指針定義/賦值,指針的數據類型,整型指針,字符指針,數組指針,函數指針,二級指針。
7、結構體定義,結構體變量、結構體指針、結構體變量與指針如何訪問結構體的成員,如何計算結構體的空間。
8、聯合體、枚舉類型、typedef、宏定義、頭文件、條件編譯、拆分多個.c文件
9、如何申請堆空間?如何釋放?
10、字符串函數,計算字符串長度,拷貝字符串到另一塊內存空間,追加字符串,比較兩個字符串。

三、linux C語言基本框架

C語言程序入口: main函數 -> main() -> 每一個程序都必須有main函數。
1、main函數有什麼特點?
1)程序必須以main作爲主函數命名。
2)程序不是從第一個函數開始執行,而是從main函數開始。
3)main函數在程序中有且僅有一個。

2、main函數基本框架?
main() -> 函數頭
{ -> 函數體

}

3、linux函數屬於一個任務,每一個任務都會一個返回值,返回值就會返回給調用函數的地方。
返回值類型寫在函數頭前面。

返回值類型 main()

{
…;
…;

   return 返回值結果;  

}

注意事項:
1)返回值類型可以是基本數據類型,也可以是自定義數據類型。

2)main執行return代表程序的退出,子函數執行了return代表子函數返回,返回到調用的地方。

3)返回值結果必須與返回值類型匹配。

例子:

int fun()

{
…;

   return 1; -> 返回到main函數中

}

int main()

{
fun();
return 0; -> 代表程序結果
}

4、頭文件
1)程序中一定要添加頭文件嗎?
不是。如果程序沒有調用到任何的函數,則不需要添加頭文件,只有當程序調用了函數,才需要添加對應的頭文件。

例子:以下例子不需要添加頭文件

int main()

{

   return 0;

}

2)頭文件有什麼作用?
對函數進行聲明,函數在調用前必須聲明,否則就會編譯警告!

3)函數對應的頭文件是什麼?

例子: printf() -> 在Ubuntu終端輸入: man 3 printf(按’q’退出) -> 得到對應的頭文件: #include <stdio.h>

例子:
#include <stdio.h>
int main()
{
printf(“helloworld!\n”);
return 0;
}

4)頭文件不加會有什麼問題?
warning: incompatible implicit declaration of built-in function ‘xxxxx’ -> xxxxx這個函數的頭文件沒有添加!

5、 linux在運行程序時,需要給程序傳遞一些命令行參數
1)怎麼樣才能實現命令行傳參?
int main() / int main(void) -> main函數不需要命令傳遞參數

int main(int argc,char *argv[]) -> main函數可以進行命令行傳參

argc -> argument count 參數個數

argv -> argument value 參數的值

./a.out -> argc = 1 argv[0] = “./a.out”

./a.out aaa -> argc = 2 argv[0] ="./a.out" argv[1] = “aaa”

./a.out aaa bbb -> argc = 3 argv[0] = “./a.out” argv[1] = “aaa” argv[2] = “bbb”

./a.out aaabbb -> argc = 2 argv[0] = “./a.out” argv[1] = “aaabbb”

2)printf()如何輸出命令行參數內容?
%d -> 以十進制形式輸出內容

%s -> 輸出字符串

3)命令行傳遞參數有什麼作用?
使用命令行傳遞參數,argv數組中值就可以每一個執行結果都不一樣,並不需要每一個修改都要重新編譯。

練習4:無論輸入多少個參數,程序都可以將所有的參數都打印出來!
   ./a.out

       ./a.out aaa

       ./a.out aaa bbb

#include <stdio.h>
     //  argv[0]   argv[1]  argv[2] argv[3]
int main(int argc,char *argv[])  //  ./a.out    aaa      bbb     ccc
{
      int i;
       for(i=0;i<argc;i++)
       {
              printf("argv[%d] = %s\n",i,argv[i]);
       }
       return 0;
}

6、註釋 -> 對代碼進行解析,需要添加對應的註釋。

單行註釋: //註釋內容

多行註釋: /註釋內容/

7、縮進與空行
當有複合語句{}時,需要將複合語句中所有表達式進行縮進。

代碼中每一個模塊使用空行進行分隔,複合語句{}需要獨立出來一行。

8、編譯程序
編譯器: gcc

用法: gcc + [需要編譯文件的路徑]

1)爲什麼需要進行編譯?
因爲C語言屬於高級語法,機器只能看懂二進制程序,所以需要將C語言編譯爲二進制文件,才能在機器上運行。

2)如何編譯?
如果不指定新的二進制文件名字是什麼,那麼編譯器默認在當前目錄下生成一個a.out二進制文件。

編譯命令: gcc test.c -> 默認在當前目錄下生成a.out二進制文件。

   				 gcc test. -o test  -> 默認在當前目錄下生成test二進制文件。

3)執行二進制程序
執行命令: ./a.out

執行命令: ./test

a.out與test除了名字不一樣,其他都一樣!

四、基本數據類型與變量

1、 linux C語言中基本數據類型有哪些?
char、short、int、long、float、double。

2、 這些數據類型在內存中佔用多少個字節?
使用sizeof()進行計算。


char、short、int、long、float、double。
 1     2     4    4     4       8   -> 基本數據類型佔用空間大小由C語言編譯系統決定!

3、 如何定義變量?
公式: 數據類型 + 變量名

數據類型? -> 從基本數據類型中選擇一個。

變量名定義規則?
1)只能由數字、字母,下劃線組成。

2)不能以數字開頭。

3)不可以與系統的關鍵字重名。

例子: 定義一個整型變量?

   int a;   -> 在內存空間連續申請4個字節,使用變量a間接訪問這片內存空間。

4、 程序運行時,會佔用內存空間?
test.c

int main()
{
      int a;
      return 0;
}

./test -> 將你的程序加載內存中

int a; -> 在內存空間連續申請4個字節,使用變量a間接訪問這片內存空間。

return 0; -> 釋放空間

5、內存如何分配空間? -> 原則: 連續空閒不確定
1)分配空間時,內存一定是連續的。
2)分配的空間,一定是空閒的(之前沒有變量申請過的)
3)分配空間時,位置是不確定的。

五、運算符號

+ - * / % == != | || & &&
  
  + - *

  /   -> 結果看兩邊符號

  5/3 = 1

  5.0/3 = 1.666667

  5/3.0 = 1.666667

  5.0/3.0 = 1.666667

  %  -> 取餘,兩邊不能出現小數點

  5.0%3

  5%3.0

  5.0%3.0

  5%3  -> 正確

  ==  判斷等於

  !=  判斷不等於

  |   -> 位或運算

  ||  -> 邏輯或運算

  &   -> 位與運算

  &&  -> 邏輯與運算

  5&6 = 0101 & 0110 = 4

  5&&6 = 1  (非0即真)

  5|6 = 0101 | 0110 = 7

  5||0 = 1  (非0即真)

六、在程序如何定義個變量?定義變量在內存中代表什麼意思?

1、 變量的定義?
格式:數據類型 + 變量

數據類型 -> 決定在內存中佔用字節的大小。

變量名字 -> 決定如何訪問到這片內存的空間。

2、初始化變量的值?
1)定義的同時初始化
int a = 100;

2)先定義,後初始化。
int a; -> 局部變量a = 隨機值

        -> 全局變量a = 0

a = 100;

注意:

“左值=右值” -> 把右值(變量/常量)賦值給左值(只能是變量)。

“左值==右值” -> 判斷左值是否等於右值?

3、 變量的生命週期以及作用域?
生命週期: 這個變量從什麼時候出現在內存中到什麼時候在內存中釋放。

作用域:變量能夠作用的地方。

 局部變量     Vs    全局變量

1)在函數體內部定義的變量,就是局部變量,在函數體外部定義的變量,就是全局變量。
2)兩者在內存中佔用的空間位置?
局部變量都在存在於棧區,全局變量都是存在於數據段(已初始化->data段,未初始化->bss段)

3)變量不初始化,則局部爲隨機值,全局爲0。
4)局部變量作用域是函數內部,全局變量作用域整個程序。
5)局部變量在棧區申請空間,在定義該變量的函數結束時,這個局部變量的空間就會釋放。
全局變量在數據段申請空間,程序結束時,全局變量的空間纔會被釋放。

4、形式參數屬於局部變量還是全局變量?
局部變量,在棧區申請空間。

5、不同函數中能不能定義相同名字變量。
可以,因爲它們在棧區佔用不同的空間。

6、 全局變量的作用域?
只能往下,不能往上。

練習1: 以下程序在內存空間中是如何變化的?結果是多少?

#include <stdio.h>
int fun2(int c)
{
       c = 20;
       return 0;
}

int fun1(int b)

{
       int c = 10;
       fun2(c);
       return 0;

}

int main(int argc,char *argv[])
{
       int a,b = 5;
       fun1(b);
       printf("b = %d\n",b);
       return 0;
}

七、ASCII碼

1、 在Ubuntu中可以查看ASCII碼錶
man ASCII(按’q’退出)

2、 什麼是ASCII碼?
其實ASCII表就是字符、八進制、十進制、十六進制轉換。

八進制   十進制   十六進制   字符

  Oct       Dec     Hex      Char

  060      48         30          0

  101      65         41          A

  141      97         61          a

 int a = 65;

 %d   -> 以十進制形式輸出內容   printf("%d\n",a); //65

 %o   -> 以八進制形式輸出內容   printf("%o\n",a); //101

 %x   -> 以十六進制形式輸出內容 printf("%x\n",a); //41

 %c   -> 以字符形式輸入內容     printf("%c\n",a); //'A'

 %f   -> 輸出浮點型數據,保留小數點後6位。

 %s   -> 輸出字符串

 %p   -> 輸出指針地址

結論: 其實字符類型也是整型數據。

八、語句與表達式?

表達式 = 語句;
a = 5 把5賦值給a -> 賦值語句
a = 5; 表達式

1、 逗號表達式?
計算規則:從左到右依次計算,結果以最後一個表達式爲準。

例子:

d = (a=a+b,c=b+c,a+c); 

a=1+2=3

c=2+3=5

d=a+c=3+5=8

例子:

int a=1,b=2,c=3,d;

d = (a+b,b-=c,c+=c);  -> 6

d = (c=a+b,b-=c,c+=b); -> 2

2、自增自減
a++ 先運算後,再自加1.

++a 先自加1,再運算.

a-- 先運算後,再自減1.

–a 先自減1,再運算.

例子:

int a = 10;

printf("%d\n",a++);//10   a=11

printf("%d\n",++a);//12   a=12

printf("%d\n",a--);//12   a=11

printf("%d\n",--a);//10   a=10

3、 += -= = /= %=
a+=5 等價於 a=a+5

4、 三目運算
形式:
表達式?結果1:結果2;

如果表達式爲真,則結果就是結果1。

如果表達式爲假,則結果就是結果2。

例子1:

int a = 3,b = 2,c;

c = (a >= b ? a : b);  -> 求a與b之間的最大值。

例子2:

A ? i : j; 以下哪個表達式與之等價?    假 -> 0-> 1 

A==0 ? i:j;

A!=0 ? i:j;  ->  OK

A==1 ? i:j;

A!=1 ? i:j;

九、IO函數?

頭文件:#include <stdio.h>

printf() -> 輸出帶格式內容到屏幕上
scanf() -> 從鍵盤中輸入帶格式內容
int a;
a -> 代表這整片內存空間
&a -> 代表這整片內存空間的地址

例子:

#include <stdio.h>
int main(int argc,char *argv[])
{
       int a;
       scanf("%d",&a);
       printf("%d\n",a);
       return 0;
}

十、linux C語言控制流

控制流有兩大塊,分別是分支、循環。

分支: if else switch

循環: for while do-while

1、 while循環

1)基本框架

while(判定條件)
{    
	-> 複合語句:循環體
   表達式;
}
-> 循環體之外 

2)處理流程
判定條件 -> 真 -> 執行循環體內容 -> 判定條件 -> 假 -> 跳出循環

3)死循環
死循環就是判定條件恆爲真,無法通過判斷判定條件爲假來跳出循環。

while(1)
{
       xxxx;  -> 一直執行!
}

4)省略{}寫法

while(1)
   xxxx;   -> 緊跟while(1)語句的表達式就是循環體的內容
   yyyy;   -> 不屬於循環體的內容 
等價於
while(1)
{
   xxxx;
}
yyyy;

----------
while(1);  -> 有分號,有循環,但是循環體沒有內容。
  xxxx;
  yyyy;
等價於
while(1)
{
}
xxxx;
yyyy;

結論: 當循環體表達式大於2個時,複合語句{}不能省略!
當循環體表達式只有1個,則{}可以省略!

練習2: 使用while循環實現將所有的參數都打印出來!

#include <stdio.h>
int main(int argc,char *argv[])  //  ./xxx aaa bbb   argc=3  argv[0]="./xxx"  argv[1]="aaa"

{
       int i = 0; //初始化語句
       while(i < argc)  //0~2   判定條件
      {
              printf("argv[%d] = %s\n",i,argv[i]);
              i++; //條件修改
       }  
      return 0;
}

練習3: 從鍵盤中獲取整型數,存放到x中,並計算出1+2+3+4+…+x

#include <stdio.h>
int main(int argc,char *argv[])
{
      int x,i=1,sum=0;
       scanf("%d",&x);
       while(i<=x)
       {
             sum += i;
              i++;
       }
       printf("sum = %d\n",sum);
       return 0;
}

2、for循環

1)基本框架
for(初始化語句;判定條件;變量操作) -> 裏面三個語句不一定要填,可以空白!

{  -> 循環體 

}

循環體之外。

2)處理流程

1
for(2;3;4)
{
   5;
}
6;

1->2->3->->5->4->3->->6    (初始化語句,只會執行一次)

3)死循環

for(;;); 等價於  while(1); 
等價於          等價於
for(;;)  等價於  while(1)
{             {

}             }

4)省略{}寫法

for(;;)
   xxxx;  -> 緊跟語句纔是循環體的內容
   yyyy;  -> 不屬於循環體的內容
等價於
for(;;)
{
   xxxx;
}
yyyy;

練習4: 從鍵盤中獲取整型數,存放到x中,並計算出1+2+3+4+…+x,要求使用for循環。

#include <stdio.h>
int main(int argc,char *argv[])
{
       int x,i,sum=0;
       scanf("%d",&x);
       for(i=1;i<=x;i++)
       {
              sum += i;
       }
       printf("sum = %d\n",sum);
       return 0;
}

3、 do-while循環

1)基本框架

do{   -> 循環體
}while(判定條件);   -> 注意: 沒有分號是語法出錯!

2)處理流程
先執行一遍循環體 -> 判定條件 -> 真 -> 執行循環體 -> 判斷條件 -> 假 -> 跳出循環

3)死循環

do{

}while(1);

4)省略{}寫法
例子1:

do
  xxxx;
while(1);
等價於
do{
 xxxx;
}while(1);

例子2:

do
  xxx;
  yyy;    -> 編譯出錯: error: expected ‘while’ before ‘printf’
while(1);

結論: 當表達式只有一條時,則複合語句可以省略,如果大於1條表達式,則必須添加,否則編譯出錯。

while(1)
   xxxx;
   yyyy;
等價於
do
  xxxx;
while(1);
yyyy;

練習5:使用do-while循環實現將所有的參數都打印出來!

 int i = 0;
   do{
       printf("argv[%d] = %s\n",i,argv[i]);
       i++;
   }while(i<argc);

練習6:從鍵盤中獲取整型數,存放到x中,並計算出1+2+3+4+…+x,要求使用do-while循環。

 int x,i=1,sum=0;
   scanf("%d",&x);
   do{
     sum+=i;
       i++;
   }while(i<=x);
   printf("sum = %d\n",sum);

4、if分支

用法一: if單獨使用

1)基本框架

if(判定條件)   -> 如果判定條件爲真,則執行復合語句,否則不執行復合語句!
{    //複合語句

}

2)省略{}寫法

if(判定條件)
   xxxx;   -> 如果條件爲真,則執行xxxx;如果爲假,就不執行xxxx;
   yyyy;   -> yyyy;不是if語句的判定範圍,所以無論條件真假,這個yyyy都會被執行。
等價於
if(判定條件)
{
   xxxx;
}
yyyy;

-----
if(判定條件);
    xxxx;
    yyyy;
等價於
if(判定條件)
{

}
xxxx;
yyyy;

用法二: if與else配合使用
1)基本框架

if(判定條件)   -> 如果判定條件爲真,就執行復合語句1
{  //複合語句1

}

else     -> 不滿足判定條件的情況,就會執行復合語句2

{  //複合語句2

}

2)省略{}寫法

if(判定條件)
   xxxx;
else
   yyyy;    --> 可以!
   
若:-----
if(判定條件)  xxxx   else   yyyy;   -> 編譯出錯: expected ‘;’ before ‘else
if(判定條件)
   xxxx;
else
   yyyy;
else
   zzzz;  --> 編譯出錯: error:else’ without a previous ‘if
   
改:------
if(判定條件1)
  xxxx;
if(判定條件2)
   yyyy;
else
   zzzz;   -> 編譯通過,else受到最近的if語句的影響!

用法三: 多個情況判斷 else if
1)基本框架

if(判定條件1)  -> 如果判定條件1是真,則執行復合語句1
{  //複合語句1

}
else if(判定條件2)  -> 如果判定條件1爲假,則進行判斷判定條件2,如果爲真,則執行復合語句2
{  複合語句2

}
else    -> 不滿足以上所有的判定條件,則執行復合語句3{  複合語句3

}

練習7: 分別使用以上三種辦法,完成該題。

 從鍵盤中獲取一個數字
 0~100   -> 打印small

101~200 -> 打印middle

201~300 -> 打印large

完成:<練習>

#include <stdio.h>
int main(int argc,char *argv[])
{
 int a=0;
 printf("Please enter the number:\n");
 scanf("%d",&a);//輸入數字
 if(a >= 0 && a <= 100)//0~100   -> 打印small
  printf("small\n");
 if(a >= 101 && a <= 200)//101~200 -> 打印middle
  printf("middle\n");
 if(a >= 201 && a <= 300)//201~300 -> 打印large
  printf("large\n");
 if(a < 0 || a > 300)//不在上訴範圍輸出error
  printf("error\n");
 return 0;
}
#include <stdio.h>
int main(int argc,char *argv[])
{
 int a=0;
 printf("Please enter the number:\n");
 scanf("%d",&a);//輸入數字
 if(a >= 0 && a <= 100)//0~100   -> 打印small
  printf("small\n");
 else
 {
  if(a >= 101 && a <= 200)//101~200 -> 打印middle
   printf("middle\n");
   else
   {
    if(a >= 201 && a <= 300)//201~300 -> 打印large
     printf("large\n");
    else//不在上訴範圍輸出error
     printf("error\n");
   }
 }
 return 0;
}
#include <stdio.h>
int main(int argc,char *argv[])
{
 int a=0;
 printf("Please enter the number:\n");
 scanf("%d",&a);//輸入數字
 if(a >= 0 && a <= 100)//0~100   -> 打印small
  printf("small\n");
 else if(a >= 101 && a <= 200)//101~200 -> 打印middle
  printf("middle\n");
 else if(a >= 201 && a <= 300)//201~300 -> 打印large
  printf("large\n");
 else       //不在上訴範圍輸出error
  printf("error\n");
 return 0;
}

5、switch語句

**1)對多種情況判斷,特別else if使用比較麻煩!
2) 基本框架

switch(需要判定的值)  -> 值類型限制:整型、字符型、枚舉類型
{
       case x:   -> 如果需要判定的值與x相等的,那麼執行xxxx;這個表示式。
              xxxx;
              break;
       case y:  -> 如果需要判定的值與y相等的,那麼執行yyyy;這個表示式。
              yyyy;
              break;
       default:  -> 如果判定的值與上面的情況都不符合,則執行kkkk;
              kkkk;
              break;
}
zzzz; -> 執行break語句後,就會執行zzzz;

例題:輸入1個數字,1->one 10->ten 都不是->error

#include <stdio.h>
int main(int argc,char *argv[])
{
       int x;
       scanf("%d",&x);
       switch(x)
       {
              case 1:
                     printf("one!\n");
                     break;
              case 10:
                     printf("ten!\n");
                     break;
              default:
                     printf("error!\n"); 
                     break;
       }   
       return 0;
}

例題:使用switch語句完成,從鍵盤中獲取一個數字

0~100   -> 打印small
101~200 -> 打印middle
201~300 -> 打印large
#include <stdio.h>
int main(int argc,char *argv[])
{
       int x;
       scanf("%d",&x);
       switch(x)
       {
              case 0 ... 100:
                     printf("small!\n");
                     break;                    
              case 101 ... 200:
                     printf("middle!\n");
                     break;                
             case 201 ... 300:
                     printf("large!\n");
                     break;                    
              default:
                     printf("error!\n"); 
                     break;
       }
       return 0;
}

3) switch結論
1)判定的值必須是整型。
2)每一個case語句後面必須添加break語句,除非有意執行後面語句。
3)記得一定要寫default,即使default永遠都不會執行。
4)break語句跳出的是swtich語句。
5)進行範圍判斷時,“…”兩邊必須有空格,包括兩邊的值 0 … 100 x>=0 && x<=100

6、break語句/continue語句

影響控制流的兩個語句
1、 break語句
1)作用對象: for循環,while循環,do-while循環,switch分支
2)作用:跳出循環/跳出switch語句

作用對象決定作用!

3)基本框架
當break語句作用循環時,立即跳出循環,一般與if語句連用。

while(1)
{
       xxxx;
       if(滿足跳出循環的條件)
              break;  -> break語句跳出的是while循環,不是if語句。  -> 繼續執行xxx; 而不是yyy;
       yyy;
}
xxx;break語句作用switch時,立即跳出switchswitch(需要判定的值)  -> 值類型限制:整型、字符型、枚舉類型
{
       case x:   -> 如果需要判定的值與x相等的,那麼執行xxxx;這個表示式。
              xxxx;
              break;
       case y:  -> 如果需要判定的值與y相等的,那麼執行yyyy;這個表示式。
              yyyy;
              break;
       default:  -> 如果判定的值與上面的情況都不符合,則執行kkkk;
              kkkk;
              break;
}
zzzz; -> 執行break語句後,就會執行zzzz;

4)幾個特殊的例子
例子1:

while()
{
       switch()
       {
              break;
              xxx;
       }
       yyy;  -> 跳到這裏。
}
zzz;

例子2:

while()
{
       while()
       {
              while()
              {
                     break;
              }
              xxxx;   -> 跳到這裏!
       }
       yyyy;
}
zzzz;

練習1: 在全校1000名學生中徵集捐款,當總數到達10萬塊就結束捐款,統計此時捐款的人數,以及平均每人捐款的金額。

#include <stdio.h>
int main(int argc,char *argv[])
{
       float money,total=0,aver; //個人捐款數量,總捐款數,平均。
       int i; //人數
       for(i=1;i<=1000;i++)
       {
              scanf("%f",&money);
              total += money;
              if(total >= 100000)
                     break;    
       }
       aver=total/i;
       printf("i = %d\n",i);
       printf("aver = %f\n",aver);
      return 0;
}

2、 continue
1)作用對象: for循環、while循環、do-while循環。
2)作用: 立即結束當次循環,馬上繼續開始執行下一次循環。

3)基本框架:

while(1)
{
       xxxx;
       if(判定條件)
              continue;
       yyyy;
}
  xxxx;  -> 判定條件  ->->   yyyy; ->  xxxx;   -> 判定條件  ->->  continue;  -> xxxx;

練習2: 要求輸出100~200之間不能被3整除的數,要求使用continue語句完成。

#include <stdio.h>
int main(int argc,char *argv[])
{
       int num;    
       for(num=100;num<=200;num++)
       {
             if(num%3==0)
                     continue;        
              printf("%d\n",num);
       }
       return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章