程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> C語言:黑客學員必修課(二)

C語言:黑客學員必修課(二)

編輯:C語言基礎知識

  算術表達式
  
  是由算術運算符和括號連接起來的式子, 以下是算術表達式的例子:
  
  a+b  (a*2)/c (x+r)*8-(a+b)/7  ++i sin(x)+sin(y)  (++i)-(j++)+(k--)   
  
  賦值運算符和賦值表達式
  
  簡單賦值運算符和表達式,簡單賦值運算符記為“=”。由“= ”連接的式子稱為賦值表達式。其一般形式為: 變量=表達式 例如:
  
  x=a+b
  
  w=sin(a)+sin(b)
  
  y=i+++--j 賦值表達式的功能是計算表達式的值再賦予左邊的變量。賦值運算符具有右結合性。因此
  
  a=b=c=5
  
  可理解為
  
  a=(b=(c=5))
  
  在其它高級語言中,賦值構成了一個語句,稱為賦值語句。 而在C中,把“=”定義為運算符,從而組成賦值表達式。 凡是表達式可以出現的地方均可出現賦值表達式。例如,式子x=(a=5)+(b=8)是合法的。它的意義是把5賦予a,8賦予b,再把a,b相加,和賦予x ,故x應等於13。
  
  在C語言中也可以組成賦值語句,按照C語言規定, 任何表達式在其未尾加上分號就構成為語句。因此如x=8;a=b=c=5;都是賦值語句,在前面各例中我們已大量使用過了。
  
  假如賦值運算符兩邊的數據類型不相同, 系統將自動進行類型轉換,即把賦值號右邊的類型換成左邊的類型。具體規定如下:
  
  1.實型賦予整型,捨去小數部分。前面的例2.9已經說明了這種情況。
  
  2.整型賦予實型,數值不變,但將以浮點形式存放, 即增加小數部分(小數部分的值為0)。
  
  3.字符型賦予整型,由於字符型為一個字節, 而整型為二個字節,故將字符的ASCII碼值放到整型量的低八位中,高八位為0。
  
  4.整型賦予字符型,只把低八位賦予字符量。
  
  void main(){
  
  int a,b=322;
  
  float x,y=8.88;
  
  char c1='k',c2;
  
  a=y;
  
  x=b;
  
  a=c1;
  
  c2=b;
  
  printf("%d,%f,%d,%c",a,x,a,c2);
  
  }
  
  int a,b=322;
  
  float x,y=8.88;
  
  char c1='k',c2;
  
  printf("%d,%f,%d,%c",a=y,x=b,a=c1,c2=b);
  
  本例表明了上述賦值運算中類型轉換的規則。a為整型,賦予實型量y值888後只取整數8。x為實型,賦予整型量b值322, 後增加了小數部分。字符型量c1賦予a變為整型,整型量b賦予c2 後取其低八位成為字符型(b的低八位為01000010,即十進制66,按ASCII碼對應於字符B)。  
  
  復合賦值符及表達式
  
  在賦值符“=”之前加上其它二目運算符可構成復合賦值符。如
  
  +=,-=,*=,/=,%=,<<=,>>=,&=,^=, =。 構成復合賦值表達式的一般形式為: 變量 雙目運算符=表達式 它等效於 變量=變量 運算符 表達式 例如: a+=5 等價於a=a+5  x*=y+7 等價於x=x*(y+7)  r%=p 等價於r=r%p
  
  復合賦值符這種寫法,對初學者可能不習慣, 但十分有利於編譯處理,能提高編譯效率並產生質量較高的目標代碼。
  
  逗號運算符
  
  C語言中逗號“,”也是一種運算符,稱為逗號運算符。 其功能是把兩個表達式連接起來組成一個表達式, 稱為逗號表達式。
  
  其一般形式為: 表達式1,表達式2 其求值過程是分別求兩個表達式的值,並以表達式2的值作為整個逗號表達式的值。
  
  void main(){
  
  int a=2,b=4,c=6,x,y;
  
  y=(x=a+b),(b+c);
  
  printf("y=%d,x=%d",y,x);
  
  }
  
  a<--2,b<--4,c<--6,x<--0,y<--0
  
  x<--a+b,y<---b+c
  本例中,y等於整個逗號表達式的值,也就是表達式2的值,x是第一個表達式的值。對於逗號表達式還要說明兩點:
  
  1.逗號表達式一般形式中的表達式1和表達式2 也可以又是逗號表達式。例如: 表達式1,(表達式2,表達式3) 形成了嵌套情形。因此可以把逗號表達式擴展為以下形式: 表達式1,表達式2,…表達式n 整個逗號表達式的值等於表達式n的值。
  
  2.程序中使用逗號表達式,通常是要分別求逗號表達式內各表達式的值,並不一定要求整個逗號表達式的值。
  
  3.並不是在所有出現逗號的地方都組成逗號表達式,如在變量說明中,函數參數表中逗號只是用作各變量之間的間隔符。
  
  [Practice] //arithmeticint a,b,c;
  
  float d;
  
  a=11;
  
  b=235;
  
  c=a+b-a*b;
  
  d=(float)c/(float)a;
  
  a=c/a;'Vtable
  
  a,2,0
  
  b,2,0
  
  c,2,0
  
  d,4,0.0
  
  of Vtable
  
  'Vupdate
  
  1,0;2,0;3,0
  
  
  4,0.0
  
  1,11
  
  2,235
  
  3,-2339
  
  4,-212.636368
  
  1,-212
  
  of Vupdate
  
  of Practice
  
  [Practice] //1int a,b,c1,c2;
  
  a=25;
  
  b=3243;
  
  c1=b/a;
  
  c2=b%a;'Vtable
  
  a,2,0
  
  b,2,0
  
  c1,2,0
  
  c2,2,0
  
  of Vtable
  
  'Vupdate
  
  1,0;2,0;3,0;4,0
  
  1,25
  
  2,3243
  
  3,129
  
  4,18
  
  of Vupdate
  
  of Practice
  
  [Practice] //1int a,b,c;
  
  a=25;
  
  b=40;
  
  c=a+b,c+35;'Vtable
  
  a,2,0
  
  b,2,0
  
  c,2,0
  
  of Vtable
  
  'Vupdate
  
  1,0;2,0;3,0
  
  1,25
  
  2,40
  
  3,65
  
  of Vupdate
  
  of Practice
  小結   
  
  1.C的數據類型
  
  基本類型,構造類型,指針類型,空類型
  
  2.基本類型的分類及特點
  
  類型說明符    字節   數值范圍
  
  字符型char      1    C字符集
  
  基本整型int     2    -32768~32767
  
  短整型short int     2       -32768~32767
  
  長整型 long int     4  -214783648~214783647
  
  無符號型 unsigned    2  0~65535
  
  無符號長整型 unsigned long 4    0~4294967295
  
  單精度實型 float    4   3/4E-38~3/4E+38
  
  雙精度實型 double   8   1/7E-308~1/7E+308
  
  3.常量後綴
  
  L或l 長整型
  
  U或u 無符號數
  
  F或f 浮點數
  
  4.常量類型
  
  整數,長整數,無符號數,浮點數,字符,字符串,符號常數,轉義字符。
  
  5.數據類型轉換
  
  ·自動轉換
  
  在不同類型數據的混合運算中,由系統自動實現轉換, 由少字節類型向多字節類型轉換。 不同類型的量相互賦值時也由系統自動進行轉換,把賦值號右邊的類型轉換為左邊的類型。
  
  ·強制轉換
  
  由強制轉換運算符完成轉換。
  
  6.運算符優先級和結合性
  
  一般而言,單目運算符優先級較高,賦值運算符優先級低。 算術運算符優先級較高,關系和邏輯運算符優先級較低。 多數運算符具有左結合性,單目運算符、三目運算符、 賦值
  
  7.表達式
  
  表達式是由運算符連接常量、變量、函數所組成的式子。 每個表達式都有一個值和類型。 表達式求值按運算符的優先級和結合性所規定的順序進行。
  本小節介紹的是向標准輸出設備顯示器輸出數據的語句。在C語言中,所有的數據輸入/輸出都是由庫函數完成的。 因此都是函數語句。本小節先介紹printf函數和putchar函數。printf函數printf函數稱為格式輸出函數,其要害字最末一個字母f即為“格式”(format)之意。其功能是按用戶指定的格式, 把指定的數據顯示到顯示器屏幕上。在前面的例題中我們已多次使用過這個函數。 
  
  一、printf函數調用的一般形式   
  
  printf函數是一個標准庫函數,它的函數原型在頭文件“stdio.h”中。但作為一個特例,不要求在使用 printf 函數之前必須包含stdio.h文件。printf函數調用的一般形式為: printf(“格式控制字符串”,輸出表列)其中格式控制字符串用於指定輸出格式。 格式控制串可由格式字符串和非格式字符串兩種組成。格式字符串是以%開頭的字符串,在%後面跟有各種格式字符,以說明輸出數據的類型、形式、長度、小數位數等。如“%d”表示按十進制整型輸出,“%ld”表示按十進制長整型輸出,“%c”表示按字符型輸出等。後面將專門給予討論。   
  
  非格式字符串在輸出時原樣照印,在顯示中起提示作用。 輸出表列中給出了各個輸出項, 要求格式字符串和各輸出項在數量和類型上應該一一對應。
  
  void main()
  {
  int a=88,b=89;
  printf("%d %d ",a,b);
  
  printf("%d,%d ",a,b);
  printf("%c,%c ",a,b);
  printf("a=%d,b=%d",a,b);
  }
  a<--8,b<--89
  printf("%d %d ",a,b);
  printf("%d,%d ",a,b);
  printf("%c,%c ",a,b);
  printf("a=%d,b=%d",a,b);
  
  本例中四次輸出了a,b的值,但由於格式控制串不同,輸出的結果也不相同。第四行的輸出語句格式控制串中,兩格式串%d 之間加了一個空格(非格式字符),所以輸出的a,b值之間有一個空格。第五行的printf語句格式控制串中加入的是非格式字符逗號, 因此輸出的a,b值之間加了一個逗號。第六行的格式串要求按字符型輸出 a,b值。第七行中為了提示輸出結果又增加了非格式字符串。
  
  二、格式字符串   
  
  在Turbo C中格式字符串的一般形式為: [標志][輸出最小寬度][.精度][長度]類型 其中方括號[]中的項為可選項。各項的意義介紹如下:
  
  1.類型類型字符用以表示輸出數據的類型,其格式符和意義下表所示:
  
  表示輸出類型的格式字符   格式字符意義
  
  d   以十進制形式輸出帶符號整數(正數不輸出符號)
  o   以八進制形式輸出無符號整數(不輸出前綴O)
  x   以十六進制形式輸出無符號整數(不輸出前綴OX)
  u   以十進制形式輸出無符號整數
  f   以小數形式輸出單、雙精度實數
  e   以指數形式輸出單、雙精度實數
  g   以%f%e中較短的輸出寬度輸出單、雙精度實數
  c   輸出單個字符
  s   輸出字符串
  
  2.標志
  
  標志字符為-、+、#、空格四種,其意義下表所示:
  
  標志格式字符    標 志 意 義
  
  -    結果左對齊,右邊填空格
  +    輸出符號(正號或負號)空格輸出值為正時冠以空格,為負時冠以負號
  #    對c,s,d,u類無影響;對o類, 在輸出時加前
  綴o   對x類,在輸出時加前綴0x;對e,g,f 類當結果有小數時才給出小數點
  
  3.輸出最小寬度
  
  用十進制整數來表示輸出的最少位數。 若實際位數多於定義的寬度,則按實際位數輸出, 若實際位數少於定義的寬度則補以空格或0。
  
  4.精度
  
  精度格式符以“.”開頭,後跟十進制整數。本項的意義是:假如輸出數字,則表示小數的位數;假如輸出的是字符, 則表示輸出字符的個數;若實際位數大於所定義的精度數,則截去超過的部分。
  
  5.長度
  
  長度格式符為h,l兩種,h表示按短整型量輸出,l表示按長整型量輸出。
  
  void main(){
  int a=15;
  float b=138.3576278;
  double c=35648256.3645687;
  char d='p';
  printf("a=%d,%5d,%o,%x ",a,a,a,a);
  printf("b=%f,%lf,%5.4lf,%e ",b,b,b,b);
  printf("c=%lf,%f,%8.4lf ",c,c,c);
  printf("d=%c,%8c ",d,d);
  } a<--15
  b<--138.3576278
  c<--35648256.3645687
  d<--'p' main()
  {
  int a=29;
  float b=1243.2341;
  double c=24212345.24232;
  char c='h'
  printf("a=%d,%5d,%o,%x ",a,a,a,a);
  printf("b=%f,%lf,%5.4lf,%e ",b,b,b,b);
  printf("c=%lf,%f,%8.4lf ",c,c,c);
  printf("d=%c,%8c ",d,d);
  }
  
  本例第七行中以四種格式輸出整型變量a的值,其中“%5d ”要求輸出寬度為5,而a值為15只有兩位故補三個空格。 第八行中以四種格式輸出實型量b的值。其中“%f”和“%lf ”格式的輸出相同,說明“l”符對“f”類型無影響。“%5.4lf”指定輸出寬度為5,精度為4,由於實際長度超過5故應該按實際位數輸出,小數位數超過4位部分被截去。第九行輸出雙精度實數,“%8.4lf ”由於指定精度為4位故截去了超過4位的部分。第十行輸出字符量d,其中“%bc ”指定輸出寬度為8故在輸出字符p之前補加7個空格。   
  
  使用printf函數時還要注重一個問題, 那就是輸出表列中的求值順序。不同的編譯系統不一定相同,可以從左到右, 也可從右到左。Turbo C是按從右到左進行的。如把例2.13改寫如下述形式:
  
  void main(){
  int i=8;
  printf("%d %d %d %d %d %d ",++i,--i,i--,i++,-i--);
  } i<--8   
  
  這個程序與例2.13相比只是把多個printf語句改一個printf 語句輸出。但從結果可以看出是不同的。為什麼結果會不同呢?就是因為printf函數對輸出表中各量求值的順序是自右至左進行 的。在式中,先對最後一項“-i--”求值,結果為-8,然後i自減1後為7。 再對“-i++”項求值得-7,然後i自增1後為8。再對“i--”項求值得8,然後i再自減1後為7。再求“i++”項得7,然後I再自增1後為8。 再求“--i”項,i先自減1後輸出,輸出值為7。 最後才求輸出表列中的第一項“++i”,此時i自增1後輸出8。但是必須注重, 求值順序雖是自右至左,但是輸出順序還是從左至右, 因此得到的結果是上述輸出結果。   
  
  
  字符輸出函數  
  
  putchar 函數  
  
  putchar 函數是字符輸出函數, 其功能是在顯示器上輸出單個字符。其一般形式為: putchar(字符變量) 例如:
  
  putchar('A'); 輸出大寫字母A
  putchar(x); 輸出字符變量x的值
  putchar(' '); 換行 對控制字符則執行控制功能,不在屏幕上顯示。 使用本函數前必須要用文件包含命令:
  #include
  #include
  void main(){
  char a='B',b='o',c='k';
  putchar(a);putchar(b);putchar(b);putchar(c);putchar(' ');
  putchar(a);putchar(b);
  putchar(' ');
  putchar(b);putchar(c);
  }
  if語句   
  
  用if語句可以構成分支結構。它根據給定的條件進行判定, 以決定執行某個分支程序段。C語言的if語句有三種基本形式。  
  
  1.第一種形式為基本形式 if(表達式) 語句; 其語義是:假如表達式的值為真,則執行其後的語句, 否則不執行該語句。其過程可表示為下圖
  
  void main(){
  int a,b,max;
  printf(" input two numbers: ");
  scanf("%d%d",&a,&b);
  max=a;
  if (max  printf("max=%d",max);
  }
  
  輸入兩個整數,輸出其中的大數。
  
  scanf("%d%d",&a,&b);
  max=a;
  if (max  printf("max=%d",max);  
  
  本例程序中,輸入兩個數a,b。把a先賦予變量max,再用if語句判別max和b的大小,如max小於b,則把b賦予max。因此max中總是大數,最後輸出max的值。
  
  2.第二種形式為if-else形式
  
  if(表達式)
  語句1;
  else
  
  語句2;
  
  其語義是:假如表達式的值為真,則執行語句1,否則執行語句2 。
  
  void main(){
  int a, b;
  printf("input two numbers: ");
  scanf("%d%d",&a,&b);
  if(a>b)
  printf("max=%d ",a);
  else
  printf("max=%d ",b);
  }
  
  輸入兩個整數,輸出其中的大數。改用if-else語句判別a,b的大小,若a大,則輸出a,否則輸出b。
  
  3.第三種形式為if-else-if形式
  
  前二種形式的if語句一般都用於兩個分支的情況。 當有多個分支選擇時,可采用if-else-if語句,其一般形式為:
  
  if(表達式1)
  語句1;
  else if(表達式2)
  語句2;
  else if(表達式3)
  語句3;
  …
  else if(表達式m)
  語句m;
  else
  語句n;
  
  其語義是:依次判定表達式的值,當出現某個值為真時, 則執行其對應的語句。然後跳到整個if語句之外繼續執行程序。 假如所有的表達式均為假,則執行語句n 。 然後繼續執行後續程序。 if-else-if語句的執行過程如圖3—3所示。
  
  #include"stdio.h"
  void main(){
  char c;
  printf("input a character: ");
  c=getchar();
  if(c<32)
  printf("This is a control character ");
  else if(c>='0'&&c<='9')
  printf("This is a digit ");
  else if(c>='A'&&c<='Z')
  printf("This is a capital letter ");
  else if(c>='a'&&c<='z')
  printf("This is a small letter ");
  else
  printf("This is an other character ");
  }
  if(c<32)
  printf("This is a control character ");
  else if(c>='0'&&c<='9')
  printf("This is a digit ");
  else if(c>='A'&&c<='Z')
  printf("This is a capital letter ");
  else if(c>='a'&&c<='z')
  printf("This is a small letter ");
  else
  printf("This is an other character ");
  
  本例要求判別鍵盤輸入字符的類別。可以根據輸入字符的ASCII碼來判別類型。由ASCII碼表可知ASCII值小於32的為控制字符。 在“0”和“9”之間的為數字,在“A”和“Z”之間為大寫字母, 在“a”和“z”之間為小寫字母,其余則為其它字符。 這是一個多分支選擇的問題,用if-else-if語句編程,判定輸入字符ASCII碼所在的范圍,分別給出不同的輸出。例如輸入為“g”,輸出顯示它為小寫字符。
  
  
  4.在使用if語句中還應注重以下問題   
  
  (1) 在三種形式的if語句中,在if要害字之後均為表達式。 該表達式通常是邏輯表達式或關系表達式, 但也可以是其它表達式,如賦值表達式等,甚至也可以是一個變量。例如: if(a=5) 語句;if(b) 語句; 都是答應的。只要表達式的值為非0,即為“真”。如在if(a=5)…;中表達式的值永遠為非0,所以其後的語句總是要執行的,當然這種情況在程序中不一定會出現,但在語法上是合法的。
  
  又如,有程序段: if(a=b)
  printf("%d",a);
  else
  
  printf("a=0"); 本語句的語義是,把b值賦予a,如為非0則輸出該值,否則輸出“a=0”字符串。這種用法在程序中是經常出現的。  
  
  (2) 在if語句中,條件判定表達式必須用括號括起來, 在語句之後必須加分號。   
  
  (3) 在if語句的三種形式中,所有的語句應為單個語句,假如要想在滿足條件時執行一組(多個)語句,則必須把這一組語句用{} 括起來組成一個復合語句。但要注重的是在}之後不能再加分號。
  
  例如:
  
  if(a>b){
  a++;
  b++;
  }
  else{ a=0;
  b=10;
  }
  C語言程序設計   
  
  本課介紹C語言程序設計的基本方法和基本的程序語句。
  
  從程序流程的角度來看,程序可以分為三種基本結構, 即順序結構、分支結構、循環結構。 這三種基本結構可以組成所有的各種復雜程序。C語言提供了多種語句來實現這些程序結構。 本章介紹這些基本語句及其應用,使讀者對C程序有一個初步的熟悉, 為後面各章的學習打下基礎。   
  
  C程序的語句   
  
  C程序的執行部分是由語句組成的。 程序的功能也是由執行語句實現的。
  
  C語句可分為以下五類:
  
  1.表達式語句
  
  2.函數調用語句
  
  3.控制語句
  
  4.復合語句
  
  5.空語句   
  
  1.表達式語句   
  
  表達式語句由表達式加上分號“;”組成。其一般形式為: 表達式; 執行表達式語句就是計算表達式的值。例如: x=y+z; 賦值語句y+z; 加法運算語句,但計算結果不能保留,無實際意義i++; 自增1語句,i值增1   
  
  2.函數調用語句   
  
  由函數名、實際參數加上分號“;”組成。其一般形式為: 函數名(實際參數表); 執行函數語句就是調用函數體並把實際參數賦予函數定義中的形式參數,然後執行被調函數體中的語句,求取函數值。(在第五章函數中再具體介紹)例如printf("C Program");調用庫函數,輸出字符串。
  3.控制語句   
  
  控制語句用於控制程序的流程, 以實現程序的各種結構方式。
  
  它們由特定的語句定義符組成。C語言有九種控制語句。 可分成以下三類:
  
  (1) 條件判定語句
  
  if語句,switch語句
  
  (2) 循環執行語句
  
  do while語句,while語句,for語句
  
  (3) 轉向語句
  
  break語句,goto語句,continue語句,return語句   
  
  4.復合語句   
  
  把多個語句用括號{}括起來組成的一個語句稱復合語句。 在程序中應把復合語句看成是單條語句,而不是多條語句,例如
  
  {
  
  x=y+z;
  
  a=b+c;
  
  printf(“%d%d”,x,a);
  
  }
  
  是一條復合語句。復合語句內的各條語句都必須以分號“;”結尾,在括號“}”外不能加分號。 
  
  5.空語句   
  
  只有分號“;”組成的語句稱為空語句。 空語句是什麼也不執行的語句。在程序中空語句可用來作空循環體。例如 while(getchar()!=' '); 本語句的功能是,只要從鍵盤輸入的字符不是回車則重新輸入。這裡的循環體為空語句。   
  
  賦值語句   
  
  賦值語句是由賦值表達式再加上分號構成的表達式語句。 其一般形式為: 變量=表達式; 賦值語句的功能和特點都與賦值表達式相同。 它是程序中使用最多的語句之一。 在賦值語句的使用中需要注重以下幾點:   
  
  1.由於在賦值符“=”右邊的表達式也可以又是一個賦值表達式,因此,下述形式 變量=(變量=表達式); 是成立的,從而形成嵌套的情形。其展開之後的一般形式為: 變量=變量=…=表達式;
  
  例如:
  
  a=b=c=d=e=5;按照賦值運算符的右接合性,因此實際上等效於:
  
  e=5;
  
  d=e;
  
  c=d;
  
  b=c;
  
  a=b;
  
  2.注重在變量說明中給變量賦初值和賦值語句的區別。給變量賦初值是變量說明的一部分,賦初值後的變量與其後的其它同類變量之間仍必須用逗號間隔,而賦值語句則必須用分號結尾。
  
  3.在變量說明中,不答應連續給多個變量賦初值。 如下述說明是錯誤的: int a=b=c=5 必須寫為 int a=5,b=5,c=5; 而賦值語句答應連續賦值
  
  4.注重賦值表達式和賦值語句的區別。賦值表達式是一種表達式,它可以出現在任何答應表達式出現的地方,而賦值語句則不能。
  
  下述語句是合法的: if((x=y+5)>0) z=x; 語句的功能是,若表達式x=y+5大於0則z=x。下述語句是非法的: if((x=y+5;)>0) z=x; 因為=y+5;是語句,不能出現在表達式中。
  
  if語句的嵌套   
  
  當if語句中的執行語句又是if語句時,則構成了if 語句嵌套的情形。其一般形式可表示如下:
  
  if(表達式)
  
  if語句;
  
  或者為
  
  if(表達式)
  
  if語句;
  
  else
  
  if語句;
  
  在嵌套內的if語句可能又是if-else型的,這將會出現多個if和多個else重疊的情況,這時要非凡注重if和else的配對問題。例如:
  
  if(表達式1)
  
  if(表達式2)
  
  語句1;
  
  else
  
  語句2;
  
  其中的else究竟是與哪一個if配對呢?
  
  應該理解為:   還是應理解為:
  
  if(表達式1)    if(表達式1)
  
   if(表達式2)   if(表達式2)
  
  語句1;   語句1;
  
  else     else
  
  語句2;   語句2;
  
  為了避免這種二義性,C語言規定,else 總是與它前面最近的if配對,因此對上述例子應按前一種情況理解。
  
  void main(){
  
  int a,b;
  
  printf("please input A,B: ");
  
  scanf("%d%d",&a,&b);
  
  if(a!=b)
  
  if(a>b) printf("A>B ");
  
  else printf("A  
  else printf("A=B ");
  
  }
  
  比較兩個數的大小關系。
  
  printf("please input A,B: ");
  
  scanf("%d%d",&a,&b);
  
  if(a!=b)
  
  if(a>b) printf("A>B ");
  
  else printf("A  
  else printf("A=B ");
  
  本例中用了if語句的嵌套結構。 采用嵌套結構實質上是為了進行多分支選擇,例3.16實際上有三種選擇即A>B、A  
  void main(){
  
  int a,b;
  
  printf("please input A,B: ");
  
  scanf("%d%d",&a,&b);
  
  if(a==b) printf("A=B ");
  
  else if(a>b) printf("A>B ");
  
  else printf("A  
  }   
  
  條件運算符和條件表達式   
  
  假如在條件語句中,只執行單個的賦值語句時, 常可使用條件表達式來實現。不但使程序簡潔,也提高了運行效率。
  
  條件運算符為?和:,它是一個三目運算符,即有三個參與運算的量。由條件運算符組成條件表達式的一般形式為:
  
  表達式1? 表達式2: 表達式3
  
  其求值規則為:假如表達式1的值為真,則以表達式2 的值作為條件表達式的值,否則以表達式2的值作為整個條件表達式的值。 條件表達式通常用於賦值語句之中。
  
  例如條件語句:
  
  if(a>b) max=a;
  
  else max=b;
  
  可用條件表達式寫為 max=(a>b)?a:b; 執行該語句的語義是:如a>b為真,則把a賦予max,否則把b 賦予max。
  
  使用條件表達式時,還應注重以下幾點:
  
  1. 條件運算符的運算優先級低於關系運算符和算術運算符,但高於賦值符。因此 max=(a>b)?a:b可以去掉括號而寫為 max=a>b?a:b
  
  2. 條件運算符?和:是一對運算符,不能分開單獨使用。
  
  3. 條件運算符的結合方向是自右至左。
  
  例如:
  
  a>b?a:c>d?c:d應理解為
  
  a>b?a:(c>d?c:d) 這也就是條件表達式嵌套的情形,即其中的表達式3又是一個條
  
  件表達式。
  
  void main(){
  
  int a,b,max;
  
  printf(" input two numbers: ");
  
  scanf("%d%d",&a,&b);
  
  printf("max=%d",a>b?a:b);
  
  }
  
  用條件表達式對上例重新編程,輸出兩個數中的大數。
  switch語句   
  
  C語言還提供了另一種用於多分支選擇的switch語句, 其一般形式為:
  
  switch(表達式){
  
  case常量表達式1: 語句1;
  
  case常量表達式2: 語句2;
  
  …
  
  
  case常量表達式n: 語句n;
  
  default : 語句n+1;
  
  }
  
  其語義是:計算表達式的值。 並逐個與其後的常量表達式值相比較,當表達式的值與某個常量表達式的值相等時, 即執行其後的語句,然後不再進行判定,繼續執行後面所有case後的語句。 如表達式的值與所有case後的常量表達式均不相同時,則執行default後的語句。
  
  void main(){
  
  int a;
  
  printf("input integer number: ");
  
  scanf("%d",&a);
  
  switch (a){
  
  case 1:printf("Monday ");
  
  case 2:printf("Tuesday ");
  
  case 3:printf("Wednesday ");
  
  case 4:printf("Thursday ");
  
  case 5:printf("Friday ");
  
  case 6:printf("Saturday ");
  
  case 7:printf("Sunday ");
  
  default:printf("error ");
  
  }
  
  }   
  
  本程序是要求輸入一個數字,輸出一個英文單詞。但是當輸入3之後,卻執行了case3以及以後的所有語句,輸出了Wednesday 及以後的所有單詞。這當然是不希望的。為什麼會出現這種情況呢?這恰恰反應了switch語句的一個特點。在switch語句中,“case 常量表達式”只相當於一個語句標號, 表達式的值和某標號相等則轉向該標號執行,但不能在執行完該標號的語句後自動跳出整個switch 語句,所以出現了繼續執行所有後面case語句的情況。 這是與前面介紹的if語句完全不同的,應非凡注重。為了避免上述情況, C語言還提供了一種break語句,專用於跳出switch語句,break 語句只有要害字break,沒有參數。在後面還將具體介紹。修改例題的程序,在每一case語句之後增加break 語句, 使每一次執行之後均可跳出switch語句,從而避免輸出不應有的結果。
  
  void main(){
  
  int a;
  
  printf("input integer number: ");
  
  scanf("%d",&a);
  
  switch (a){
  
  case 1:printf("Monday ");break;
  
  case 2:printf("Tuesday "); break;
  
  case 3:printf("Wednesday ");break;
  
  case 4:printf("Thursday ");break;
  
  case 5:printf("Friday ");break;
  
  case 6:printf("Saturday ");break;
  
  case 7:printf("Sunday ");break;
  
  default:printf("error ");
  
  }
  
  }
  
  在使用switch語句時還應注重以下幾點:
  
  1.在case後的各常量表達式的值不能相同,否則會出現錯誤。
  
  2.在case後,答應有多個語句,可以不用{}括起來。
  
  3.各case和default子句的先後順序可以變動,而不會影響程序執行結果。
  
  4.default子句可以省略不用。程序舉例
  
  輸入三個整數,輸出最大數和最小數。
  
  void main(){
  
  int a,b,c,max,min;
  
  printf("input three numbers: ");
  
  scanf("%d%d%d",&a,&b,&c);
  
  if(a>b)
  
  {max=a;min=b;}
  
  else
  
  {max=b;min=a;}
  
  if(max  
  max=c;
  
  else
  
  if(min>c)
  
  min=c;
  
  printf("max=%d min=%d",max,min);
  
  }   
  
  本程序中,首先比較輸入的a,b的大小,並把大數裝入max, 小數裝入min中,然後再與c比較,若max小於c,則把c賦予max;假如c小於min,則把c賦予min。因此max內總是最大數,而min內總是最小數。最後輸出max和min的值即可。 計算器程序。用戶輸入運算數和四則運算符, 輸出計算結果。
  
  void main(){
  
  float a,b,s;
  
  char c;
  
  printf("input eXPression: a+(-,*,/)b ");
  
  scanf("%f%c%f",&a,&c,&b);
  
  switch(c){
  
  case '+': printf("%f ",a+b);break;
  
  
  case '-': printf("%f ",a-b);break;
  
  case '*': printf("%f ",a*b);break;
  
  case '/': printf("%f ",a/b);break;
  
  default: printf("input error ");
  
  }
  
  }   
  
  float a,b,s;
  
  char c;
  
  printf("input expression: a+(-,*,/)b ");
  
  scanf("%f%c%f",&a,&c,&b);
  
  switch(c){
  
  case '+': printf("%f ",a+b);break;
  
  case '-': printf("%f ",a-b);break;
  
  case '*': printf("%f ",a*b);break;
  
  case '/': printf("%f ",a/b);break;
  
  default: printf("input error ");
  
  }
  
  本例可用於四則運算求值。switch語句用於判定運算符, 然後輸出運算值。當輸入運算符不是+,-,*,/時給出錯誤提示。
  
  循環結構程序   
  
  循環結構是程序中一種很重要的結構。其特點是, 在給定條件成立時,反復執行某程序段,直到條件不成立為止。 給定的條件稱為循環條件,反復執行的程序段稱為循環體。 C語言提供了多種循環語句,可以組成各種不同形式的循環結構。
  while語句   
  
  while語句的一般形式為: while(表達式)語句; 其中表達式是循環條件,語句為循環體。
  
  while語句的語義是:計算表達式的值,當值為真(非0)時, 執行循環體語句。其執行過程可用圖3—4表示。 統計從鍵盤輸入一行字符的個數。
  
  #include
  
  void main(){
  
  int n=0;
  
  printf("input a string: ");
  
  while(getchar()!=' ') n++;
  
  printf("%d",n);
  
  } int n=0;
  
  printf("input a string: ");
  
  while(getchar()!=' ')
  
  n++;
  
  printf("%d",n);
  
  本例程序中的循環條件為getchar()!=' ',其意義是, 只要從鍵盤輸入的字符不是回車就繼續循環。循環體n++完成對輸入字符個數計數。從而程序實現了對輸入一行字符的字符個數計數。
  
  使用while語句應注重以下幾點:
  
  1.while語句中的表達式一般是關系表達或邏輯表達式,只要表達式的值為真(非0)即可繼續循環。
  
  void main(){
  
  int a=0,n;
  
  printf(" input n: ");
  
  scanf("%d",&n);
  
  while (n--)
  
  printf("%d ",a++*2);
  
  } int a=0,n;
  
  printf(" input n: ");
  
  scanf("%d",&n);
  
  while (n--)
  
  printf("%d ",a++*2);
  
  本例程序將執行n次循環,每執行一次,n值減1。循環體輸出表達式a++*2的值。該表達式等效於(a*2;a++)
  
  2.循環體如包括有一個以上的語句,則必須用{}括起來, 組成復合語句。
  
  3.應注重循環條件的選擇以避免死循環。
  
  void main(){
  
  int a,n=0;
  
  while(a=5)
  
  printf("%d ",n++);
  
  } int a,n=0;
  
  while(a=5)
  
  printf("%d ",n++);
  
  本例中while語句的循環條件為賦值表達式a=5, 因此該表達式的值永遠為真,而循環體中又沒有其它中止循環的手段, 因此該循環將無休止地進行下去,形成死循環。4.答應while語句的循環體又是while語句,從而形成雙重循環。
  
  do-while語句   
  
  do-while語句的一般形式為:
  
  do
  
  語句;
  
  while(表達式);
  
  其中語句是循環體,表達式是循環條件。
  
  do-while語句的語義是:
  
  先執行循環體語句一次, 再判別表達式的值,若為真(非0)則繼續循環,否則終止循環。
  
  do-while語句和while語句的區別在於do-while是先執行後判定,因此do-while至少要執行一次循環體。而while是先判定後執行,假如條件不滿足,則一次循環體語句也不執行。
  
  while語句和do-while語句一般都可以相互改寫。
  
  void main(){
  
  
  int a=0,n;
  
  printf(" input n: ");
  
  scanf("%d",&n);
  
  do printf("%d ",a++*2);
  
  while (--n);
  
  }
  
  int a=0,n;
  
  printf(" input n: ");
  
  scanf("%d",&n);
  
  do printf("%d ",a++*2);
  
  while (--n);
  
  在本例中,循環條件改為--n,否則將多執行一次循環。這是由於先執行後判定而造成的。
  
  對於do-while語句還應注重以下幾點:
  
  1.在if語句,while語句中, 表達式後面都不能加分號, 而在 do-while語句的表達式後面則必須加分號。
  
  2.do-while語句也可以組成多重循環,而且也可以和while語句相互嵌套。
  
  3.在do和while之間的循環體由多個語句組成時,也必須用{}括起來組成一個復合語句。
  
  4.do-while和while語句相互替換時,要注重修改循環控制條件。
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved