C語言筆記(一)--- 基本類型、運算符、表達式、分支結構及循環控制、scanf、printf介紹

一. C語言概述

1. 只有32個關鍵字

auto break case char const continue default do double else enum extern float for goto if int long register return short signed static sizof struct switch typedef union unsigned void volatile while
Turbo C 擴充了11個關鍵字: asm _cs _ds _es _ss cdecl far hugeinterrupt near pascal

2. 語法限制不太嚴格,程序設計自由度大

3. 中級語言

C語言允許直接訪問物理地址,能進行位(bit)操作,能實現匯編語言的大部分功能,可以直接對硬件進行操作。因此有人把他稱為 中級語言

4. 生成目標代碼質量高,程序執行效率高。

5. 對程序員的要求也高。

6. 簡單的C程序介紹:

main() {
   printf("hello world!\n");
}

解析:
a ) main是主函數的函數名,表示這是一個主函數
b)每一個C源程序都必須 有,且只能有 一個 main函數
c)函數調用語句,printf函數 的功能是把要輸出的內容送到顯示器上去顯示。
d)printf函數 是一個由系統 定義的標準函數 ,可以直接調用。

#include <math.h>
#include "stdio.h"
main() {
  double x,s;
  printf("input number:\n");
  scanf("%lf",&x);
  s=sin(x);
  printf("sine of %lf is %lf",x,s);
}

解析:
a ) #include 稱為文件包含命令
b)擴展名為 .h 的文件稱為頭文件
c)定義兩個實數變量,以被后面程序使用。
d)顯示提示信息
e)從鍵盤獲得一個 實數x
f)求 x 的正弦,并把他賦給 變量s
g)顯示程序運算結果
h)main函數結束

main() 之前的兩行 #include 稱為 預處理指令 。
預處理指令 還有其他幾種,這里的 include 稱為 文件包含命令 ,其意義是把 尖括號<>引號"" 內指定的文件包含到本程序中來,成為本程序的一部分。被包含的文件通常是系統提供的,其擴展名為 .h 。因此也稱為 頭文件首部文件 。

7. 輸入和輸出函數

前面的例子中用到了 scanfprintf 。
它們被稱為格式輸入函數和格式輸出函數。

使用格式為:

printf("格式字符串",參數表)

例如,前面例子中的 %lf 為格式字符,表示按雙精度浮點數處理。
他在格式串中出現2次,對應了x和s兩個變量。

8. 注釋符號

注釋符號是 /* */

9. C源程序的結構特點

1)一個C語言源程序可以由一個或多個源文件組成
2)每個源文件可由一個或多個函數組成
3)一個源程序不論由多少個文件組成,都有 一個且只能有一個 main函數 ,即 主函數
4)源程序中可以有 預處理指令include 命令僅為其中的一種),預處理指令 通常應放在源文件或源程序的最前面。
5)每一個說明,每一個語句都必須以分號結尾。但 預處理命令 、函數頭花括號"}" 之后不能加分號
6)標識符、關鍵字之間必須至少有一個空格以示間隔。

10. C語言的字符集:

字符是組成語言的最基本的元素。
C語言字符集由字母、數字、空格、標點和特殊字符組成。
在字符常量、字符串常量和注釋中還可以使用漢字或其他可表示的圖形符號。

11. C語言詞匯:

在C語言中使用的詞匯分為6類:
標識符關鍵字 、 運算符分隔符 、 常量注釋符 等。

11.1 標識符

標識符 只能由字母、數字和下劃線_組成,并且第一個字母不能是數字。

需要注意的是:

  • a)標準C不限制標識符的長度,但他受各種版本的C語言編譯系統限制,同時也受到具體機器的限制。
  • b)在標識符中,大小寫是區別的。
  • c)命名是任意的,但是最好人為的“顧名思義”。

11.2 關鍵字

也稱為 保留字
分為 類型說明符(例如 int double )、語句定義符(例如 if else )、預處理命令字(例如 include )等


二. 程序的靈魂--算法

數據結構+算法=程序


三. 數據類型、運算符與表達式

1. 數據類型

  • 基本類型:整型、字符型、單精度浮點型、雙精度浮點型
  • 枚舉類型
  • 構造類型:數組類型、結構體類型、共用體類型
  • 指針類型
  • 空類型 : void

2. 常量與變量

2.1 常量

直接常量,如 10,0,4.6,'a'

標識符常量(符號常量),即用標識符代表一個常量。
在C語言中,可以用一個標識符表示一個常量,稱之為符號常量。

符號常量在使用之前必須先定義:
#define 標識符 常量

習慣上符號常量的標識符使用大寫字母。
例如:

#define PRICE 30
...
total=num*PRICE;

3. 變量 由變量名 變量值和存儲單元組成。

4. 整型常量的表示方法:

  • 1)十進制整常數:例如 237、-56、65535 等,但不能以 0 開頭,如 023 是錯誤的,因為在程序中是根據前綴來區分各種進制數的。因此在書寫常數時不要把前綴弄錯造成結果不正確。

  • 2)八進制整常數:以 0 開頭,且通常是無符號數。如:015 0101 0177777 ,
    下面是錯誤的:256(沒有以 0 開頭)03A2(錯誤數碼) -0127(出現了負號)

  • 3)十六進制整常數:以 0X0x 開頭,如 0x2a , 0XA0 0XFFFF ,
    以下是錯誤的:5A(沒有前綴)、0X3H(含義非法代碼)

  • 4)整型常數的后綴:在16位字長的機器上,基本整型的長度也只有16位,表示數的范圍是有限的,所以如果超出了 0-65535 的范圍,就必須使用長整型數來表示。使用后綴 Ll 。例如:
    十進制長整常數:158L,358000L
    八進制長整常數:012L 077L 0200000L
    十六進制長整常數:0x15L 0xA5L 0x10000L

    C編譯系統將為他分配 4個字節 存儲空間。而對基本整型只分配 2個字節,因此在運算和輸出格式上要予以注意,避免出錯。
    無符號數也可用后綴表示,使用 Uu ,例如 358u , 0x38Au , 235Lu 均為無符號數。

5. 整型變量

數值是以補碼表示的。

  • 1)正數的補碼和源碼相同。

  • 2)負數的補碼:將該數的絕對值的二進制形式按位取反再加1.
    例如求-10的補碼:
    10的源碼是 00000000 00001010
    取反 11111111 11110101
    +1 11111111 11110110
    由此可知,左面的第一位是表示符號的。

6. 整型變量的分類:

  • 1)基本型:int 占2個字節

  • 2)短整型:short int或short,所占字節和取值范圍與基本型相同

  • 3)長整型:long int或long,占4個字節

  • 4)無符號型:unsigned,無符號型又可與上述三種類型匹配而構成:

    • a) 無符號基本型 unsigned int或unsigned
    • b) unsigned short
    • c) unsigned long

各種無符號類型所占的內存空間字節數與相應的有符號類型相同。
但由于省去了符號位,故不能表示負數。
有符號整型變量最大表示32767,無符號最大表示65535

7. 整型數據的溢出

例如:

int a,b;
a=32767;
b=a+1;
printf("%d,%d\n",a,b);//輸出32767,-32768

另外,長整型和基本整型之間允許進行計算,運算結果為長整型,但可以把長整型轉換為基本整型,這是由編譯系統自動完成的。但可能會溢出。

8. 實型數據

也稱為浮點型。
在C語言中,實數只采用十進制。
他有2種形式:十進制小數形式指數形式

  • 1)十進制數形式:如 0.0 25.0 5.789 0.13 5.0 300. -267.8230
    注意:必須有小數點

  • 2)指數形式:由十進制數,加階碼標志 e 或者 E 以及階碼(只能為整數,可以帶符號)組成。
    一般形式為: a E n,其值為a*10的n次方。

以下不是合法的實數:
345(無小數點) E7(E之前沒有數字) -5(無E標志) 53.-E3(負號位置不對) 2.7E(E后無數字)

標準C允許浮點數使用后綴 fF 表示該數為浮點數,如 356f356. 是等價的。

9. 實型變量

實型變量占4個字節。
按指數形式存儲。
實數 3.14156 在內存中存放形式如下:
+ .314156 1
分別表示 數符 小數部分 指數

小數部分占的位(bit)數愈多,數的有效數字愈多,精度愈高。
指數部分占的位數愈多,則能表示的數值范圍愈大。

10. 實型變量的分類

分為單精度 float 和 雙精度 double 和 長雙精度 long double ,
在Turbo C中,float 占 4個字節(32位),只能提供7位有效數字。
double 占 8個字節,可提供16位有效數字,
long double 占 16個字節,有效數字19位。

11. 實型數據的舍入誤差

由于實型變量是由有限的存儲單元組成的,因此能提供的有效數字總是有限的。
如下例:

main() {
 float a,b;
 a=123456.789e5; 
 b=a+20;
 printf("%f\n",a);
 printf("%f\n",b);
}

注意:1.0/3*3的結果并不等于1.

main() {
 float a;
 double b;
 a=33333.33333;//由于有效位數只有7位,而整數位已占5位,故小數二位之后均為無效數字
 b=33333.33333333333333; //b是雙精度型,有效位是16位,但Turbo C規定小數后最多6位,其余部分四舍五入
 printf("%f\n%f\n",a,b);
}

12. 實型常數的類型:都按double型處理。

13. 字符常量

字符常量只能使用 單引號',不能使用 雙引號"其他括號
只能是 單個字符 。
字符可以是字符集中的任意字符。
但數字被定義為字符型之后就不能參與數值運算,如 '5'5 是不同的。

14. 轉義字符

\n 表示回車換行=10
\t=9 \b=8 \r=13 \f=12 \\=92 \'=39 \"=34 \a=7
\ddd=1-3位八進制數所代表的字符
\xhh = 1-2位十六進制數所代表的字符

15.

字符變量使用 char a,b; 表示

16. 字符數據在內存中的存儲形式及使用方法

每個字符變量被分配一個字節的內存空間,因此只能存放一個字符。

x 的十進制ASCII碼是120,y 的十進制ASCII碼是121,對字符變量a,b賦予'x' 'y'值:
a='x';b='y';

實際上 a,b兩個單元內存放120和121的二進制代碼。
所以也可以把他們看成是整型量。
C語言允許對整型變量賦予字符串,也允許對字符變量賦予整型值、在輸出時,允許把字符變量按整型量輸出,也允許把整型量按字符量輸出。

當把整型量按字符量處理時,只有低八位字節參與處理。
例如:

char a,b;
a=120;
b=121;
printf("%c,%c\n",a,b);
printf("%d,%d\n",a,b);

可以看出printf函數格式串中的格式符決定了輸出的是字符還是整型。
又如:

char a,b,;
a='a';
b='b';
a=a-32;
b=b-32;
printf("%c,%c\n%d,%d\n",a,b,a,b);

由于大小寫字母差32,所以這個是把小寫字符轉換為大寫字符。

17. 字符串常量

字符串常量使用 雙引號" 括起來。
在C語言中沒有相應的字符串變量,這是與BASIC語言不同的,但是可以用一個字符數組來存放一個字符串常量。
字符常量占一個字節空間,字符串常量占的內存字節數等于 字符串中字節數+1。
增加的一個字節存放 \0 (ASCII碼為0),這是字符串結束的標志。

18. 變量賦初值:

int a=3;
int b,c=5;
float x=3.2,y=3f,z=0.75;
char ch1='K',ch2='P';

注意:在聲明變量時不允許連續賦值,如 int a=b=c=5 是不合法的

19. 各類數值型數據之間的混合運算

變量的數據類型是可以轉換的,一種是 自動轉換,一種是 強制轉換 。
自動轉換發生于不同數據類型混合運算時由編譯系統自動完成。
遵循以下原則:

  • 1)若參與運算量的類型不同,則先轉換成同一類型再進行運算。

  • 2)轉換按數據長度增加的方向進行,以保證精度不降低,如int和long型運算時,先把int轉換成long型

  • 3)所有的浮點運算都是以雙精度型進行的,即使僅含float單精度量運算的表達式,也是先轉換成double型,再做運算。

  • 4)char型和short型參與運算時,必須先轉換成int型

  • 5)在賦值運算中,賦值號兩邊量的數據類型不同時,賦值號右邊量的類型將轉換為左邊量的類型。如果右邊量的數據類型長度左邊長時,將丟失一部分數據,這樣會降低精度,丟失的部分按四舍五入向前舍入。

強制類型轉換:如(float)a ; (int)(x+y),使用強轉時注意:

  • 1)類型說明符和表達式都必須加括號(單個變量可以不加)

  • 2)無論是強轉還是自動轉換,都只是為了本次運算的需要而對變量的數據長度進行的臨時性轉換,而不改變數據說明時對該變量定義的類型。

20. 算數運算符和算數表達式:

  • 1)算術運算符:+ - * / % ++ -- ,其中 + 具有右結合性,- * / 具有左結合性。

  • 2)關系運算符: > < == >= <= !=

  • 3)邏輯運算符: && || !

  • 4)位操作運算符:& | ~ ^ << >>

  • 5)賦值運算符: = += -= *= /= %= &= |= ^= >>= <<=

  • 6)條件運算符: ?:

  • 7)逗號運算符:用于把若干表達式組合成一個表達式 ( , ) .

  • 8)指針運算符:用于取內容( * )和取地址( & ) 2種運算。

  • 9)求字節數運算符:用于計算數據類型所占的字節數( sizeof );

  • 10)特殊運算符: 括號() 下標[] 成員(→,.) 等幾種。

注意: /運算符 根據參數的不同返回結果也不同,參數是整型,返回結果也是整型,參數有一個是浮點型,則返回結果就是雙精度型。
%求余運算符 要求參數都是整型, 結果也是整型。

21. 運算符的優先級

具有15級,1級最高,15級最低,優先級較高的先執行。
優先級相同時,按照運算符的結合性所規定的結合方向處理。

22. 運算符的結合性

分左結合性和右結合性。
例如,算數運算符的結合性是自左至右,即先左后右,如有表達式 x-y+z ,則y應先與-號結合,執行x-y,再執行+z的運算。這就是左結合性。
最典型的右結合性運算符是賦值運算符,如 x=y=z ,先執行 y=z 再執行 x=(y=z) 運算。
C語言運算符中有不少為右結合性,應注意區別,以避免理解錯誤。

23. 強類型轉換運算符 (類型說明符) (表達式)。

24. ++ -- 具有右結合性。

++i 是先自增再參與運算,i++ 是先參與運算再自增。

例如:

int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);

結果 p=15 q=24 ,其中 q 相當于 j 先自增再參與元素,j 自增3次后變成8,然后 q=24 .

25. 賦值運算符和賦值表達式

賦值運算符具有右結合性,即先計算 = 右邊的表達式,然后把結果賦給左邊的變量。因此 a=b=c=5 可理解為 a=(b=(c=5)) .

在C中,把 “=” 定義為運算符,從而組成賦值表達式。凡是表達式可以出現的地方均可出現賦值表達式。例如:
x=(a=5)+(b=8); 是合法的,他的意義是把5賦給a,把8賦給b,再把a,b相加賦給x。
按照C語言規定,任何表達式在其末尾加上 分號; 就構成為語句,因此如 x=8;a=b=c=5; 都是賦值語句。

26. 類型轉換:

  • 1)實型賦予整型 將舍棄小數部分。
  • 2)整型賦予實型:小數部分為0.
  • 3)字符型賦予整型:高八位為0的整型。

27. 逗號運算符

表達式1,表達式2 :表示分別求兩個表達式的值,并以表達式2的值做為整個逗號表達式的值。例如:

main() {
 int a=2,b=4,x,y;
 y=(x=a+b),(b+c);
 printf("y=%d,x=%d",y,x);
}

注意:

  • 1)逗號表達式一般形式中的表達式1和表達式2也可以又是逗號表達式,即允許嵌套。因此,可以把逗號表達式擴展為以下形式:
    表達式1,表達式2,...,表達式n
  • 2)程序中使用逗號表達式,通常是要分別求逗號表達式內各表達式的值,并不一定要求整個逗號表達式的值。

并不是在所有出現逗號的地方都組成逗號表達式,如在變量聲明中,函數參數表中逗號只是用作變量之間的間隔符。


四. 最簡單的C程序設計--順序程序設計

1. C程序的結構

C程序包含多個源程序文件;每個源程序文件由預處理指令、全局變量聲明、函數1,。。。函數n組成;函數由函數首部和函數體組成;函數體由局部變量聲明和執行語句組成。

  • 1)表達式語句以 ; 結尾
  • 2)函數調用語句:由函數名、實際參數加上 ; 組成。一般形式為 函數名(實際參數表);
  • 3)控制語句:if、switch、do while、while、for、break、goto、continue、return 。
  • 4)復合語句:{} 括起來的語句。在程序中把復合語句看成單條語句,而不是多條語句。復合語句內的語句以 ; 結尾,但 {} 外不再加分號
  • 5)空語句:只有一個 ; 的語句,可用來做空循環體。

2. 賦值語句

變量=(變量=表達式); 是允許的,因此 a=b=c=5; 也是允許的,但是在變量聲明中,如 int a=b=c=5; 是錯誤的,必須使用 int a=5,b=5,c=5;

注意賦值表達式和賦值語句的區別:
賦值表達式是一種表達式,他可以出現在任何允許表達式出現的地方,而賦值語句則不能。
下述語句是合法的:

if((x=y+5)>0) z=x;//合法
if((x=y+5;)>0) z=x;//非法;因為x=y+5;是語句,不能出現在表達式中。

3. 數據輸入輸出的概念以及在C語言中的實現:

  • 1)所謂輸入輸出是以計算機為主體而言的。
  • 2)本章所介紹的是向標準輸出設備顯示器輸出數據的語句
  • 3)在C語言中,所有的數據輸入/輸出都是由庫函數完成的。因此都是函數語句。
  • 4)在使用C語言庫函數時,要用預編譯指令 #include <xx.h> ,標準輸入輸出函數要引用 #include <stdio.h>#include "stdio.h"
    1. 考慮到 printfscanf 函數使用頻繁,系統允許在使用這兩個函數時可以不加 #include <stdio.h>

4. 字符數據的輸入輸出:

  • 1)putchar(字符變量) 對控制字符則執行控制功能,不在屏幕上顯示。
    使用本函數前必須使用 #include<stdio.h>
    1. char getchar();
      使用 getchar 時注意:
      a)只能接受單個字符,輸入數字也按字符處理。輸入多于一個字符時,只接收第一個字符

5. 格式輸入與輸出:

    1. printf函數printf("格式控制字符串",輸出表列) 其中格式控制串以 % 開頭,% 后面跟有各種格式字符,以說明輸出數據的類型、形式、長度、小數位數等。如:
      %d = 按十進制整型輸出
      %ld = 按十進制長整型輸出
      %c = 按字符型輸出等。
      輸出表列給出了各個輸出項,要求格式字符串和各輸出項在數量和類型上應該一一對應。
  • 2)格式字符串:在TurboC中格式字符串的一般形式為:
    [標志][輸出最小寬度][.精度][長度]類型
    其中 [] 的項為可選項。
    各項的意義介紹如下:

    • a)類型:
      d = 十進制有符號整數(整數不輸出符號);
      o = 八進制輸出無符號整數(不輸出前綴 0 );
      x,X = 十六進制輸出無符號整數(不輸出前綴 0x )
      u = 十進制輸出無符號整數;
      f = 以小數形式輸出單、雙精度實數
      e,E = 以指數形式輸出單、雙精度實數
      g,G = 以 %f%e 中較短的輸出寬度輸出單、雙精度實數。
      c = 輸出單個字符
      s = 輸出字符串

    • b)標志:
      標志字符為 - + # 空格 四種,
      其意義如下:
      - = 左對齊,右邊填空格
      + = 輸出符號(正號或負號)
      空格 = 輸出值為正時冠以空格,為負時冠以負號
      # = 對c s d u 類無影響;對o類,在輸出時加前綴o;對x類,在輸出時加前綴 0x ;對 e g f類當結果有小數時才給出小數點。

    • c)輸出最小寬度:
      用十進制整數來表示輸出的最少位數。
      若實際位數多于定義的寬度,則按實際位數輸出;否則補以空格或0.

    • d)精度:
      精度格式符以 "." 開頭,后跟十進制整數。
      本項的意義是:
      如果輸出數字,則表示小數的位數;
      如果輸出的是字符,則表示輸出字符的個數;
      若實際位數大于所定義的精度數,則截去超過的部分。

    • e)長度:
      長度格式符為h,l兩種,h表示按短整型量輸出,l表示按長整型量輸出。
      如:

main() {
 int a=15;
 float b=123.1234567;
 double c=12345678.1234567;
 char d='p';
 printf("a=%d,%5d,%o,%x\n",a,a,a,a);
 printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);
 printf("c=%lf,%f,%8.4lf\n",c,c,c);
 printf("d=%c,%8c\n",d,d);
}

使用 printf函數 時還要注意一個問題,那就是輸出表列中的求值順序。
不同的編譯系統不一定相同,可以從左到右,也可以從右到左。
TurboC是從右到左的。請看下面的例子:

main() {
 int i=8;
 printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);
}

表達式計算是自右向左,但顯示依然是自左向右,注意理解。

  • 3)scanf函數(格式輸入函數)
    scanf函數 的一般形式為:scanf("格式控制字符串",地址表列);

其中,格式控制字符串的作用與 printf 相同,但是不能顯示非格式字符串,也就是不能顯示提示字符串。
地址表列中給出各變量的地址。
地址是由 地址運算符& 后跟變量名組成的,例如&a &b 分別表示 變量a變量b 的地址。
這個地址就是編譯系統在內存中給a b變量分配的地址,在C語言中,使用了地址這個概念,這是與其他語言不同的。
應該把變量的值和變量的地址這兩個不同的概念區分開來。
變量的地址是C編譯系統分配的,用戶不必關心具體的地址是多少。
&a 實際上是一個取值表達式,表示獲取 變量a 的內存地址;

例如:

main() {
 int a,b,c;
 printf(" input a,b,c\n");
 scanf("%d%d%d",&a,&b,&c);
 printf("a=%d,b=%d,c=%d",a,b,c);
}

由于 scanf函數 本身不能顯示提示串,所以先用 printf 語句在屏幕上輸出提示,請用戶輸入a、b、c的值。
執行 scanf 語句,則退出TC屏幕進入用戶屏幕等待用戶輸入。
用戶輸入7 8 9后按下回車鍵,此時系統又將返回TC屏幕。
scanf 語句的格式串中由于沒有非格式字符在 "%d%d%d" 之間做為輸入時的間隔,因此在輸入時要用一個以上的空格或回車鍵做為每兩個輸入數之間的間隔。

  • 4)scanf的格式字符串:
    一般形式為 %[*][輸入數據寬度][長度]類型
    • a)格式:
      d = 十進制整數
      o = 八進制整數
      x = 十六進制整數
      u = 無符號十進制整數
      f或e = 輸入實型數(小數形式或指數形式)
      c = 單個字符
      s = 字符串

    • b)"*" 符號:
      用來表示該輸入項,讀入后不賦予相應的變量,即跳過該輸入值,如 scanf("%d %*d %d",&a,&b); 當輸入1 2 3時,把1賦予a,2被跳過,3賦予b。

    • c)寬度:
      用十進制整數指定輸入的寬度(即字符數)。
      例如 scanf("%5d",&a); 輸入12345678,只把123456賦予變量a,其余部分被截去。
      又如 scanf("%4d%4d",&a,&b); 輸入12345678,將把1234賦予a,5678賦予b。

    • d)長度:
      長度格式符為 lh
      l 表示輸入長整型數據(如 %ld )和雙精度浮點數( %lf )。
      h 表示輸入短整型數據。

使用 scanf函數 還必須注意以下幾點:

  • a)scanf 中沒有精度控制,如:scanf("%5.2f",&a) 是非法的。不能企圖用此語句輸入小數2位的實數。
  • b)scanf 中要求給出變量地址,如果給出變量名則會出錯。如 scanf("%d",a) 是非法的,應該是scanf("%d",&a);
  • c) 在輸入多個數值數據時,若格式控制串中沒有非格式字符做為輸入數據之間的間隔則可用 空格、TAB或回車 做為間隔。C編譯在碰到 空格、TAB、回車或非法數據 (如對 "%d" 輸入12A時,A即為非法數據)時即認為該數據結束。
  • d)在輸入字符數據時,若格式控制串中無非格式字符,則認為所有輸入的字符均為有效字符。
    例如:scanf("%c%c%c",&a,&b,&c); 輸入 d e f,則把'd'賦予a,' '空格賦予b,'e'賦予c。
    只有當輸入為def時,才會分布賦予d e f。
    如果在格式控制中加入空格做為間隔,如 scanf("%c %c %c",&a,&b,&c); 則輸入時各數據之間可加空格。
  • e)如果格式控制串中有非格式字符則輸入時也要輸入該非格式字符。
    例如:scanf("%d,%d,%d",&a,&b,&c); 則應輸入5,6,7; 又如 scanf("a=%d,b=%d,c=%d",&a,&b,&c); 則輸入應為 a=5,b=6,c=7
    f) 如輸入的數據與輸出的類型不一致時,雖然編譯能夠通過,但結果將不正確。

五,分支結構程序

1. 關系運算符:

k==j==i+5 ,根據運算符的左結合性,先計算 k==j ,該式不成立,其值為0,再計算 0==i+5 ,也不成立,故表達式為0.

2. 邏輯運算符

&& || !
&&|| 均為雙目運算符,具有左結合性。
! 為單目運算符,具有右結合性。
邏輯運算符和其他運算符優先級的關系可表示如下:

! >  算數運算符  > 關系運算符 > &&和||  > 賦值運算符。

! > &&  >  ||  , &&和||低于關系運算符,! 高于算數運算符。

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

a>b && c>d 等價于 (a>b)&&(c>d)
!b==c || d<a 等價于 ((!b)==c)||(d<a)
a+b>c&&x+y<b 等價于 ((a+b)>c)&&((x+y)<b)

3. 邏輯運算的值

邏輯運算的值也為“真”和“假”兩種,用“1”和“0”來表示。
雖然C編譯在給出邏輯運算值時,以1表示真,以0表示假,但是反過來在判斷一個量是真還是假時,以0表示假,以非0值表示真。

例如 5&&3 的值為“真”,即為1.

4. if語句:

if(表達式) 語句


if(表達式)
    語句1;
else
    語句2;


if(表達式)
    語句1;
else if(表達式2)
    語句2;
else if(表達式3)
     語句3;
    ...
else if(表達式m)
     語句m;
else
     語句n;

在使用 if語句 時還應注意以下問題:

  • a)if 后面的表達式通常是邏輯表達式,但也可以是其他表達式,如賦值表達式等,甚至也可以是一個變量。如 if(a=b) printf("%d",a); else printf("a=0"); 本語句的意義是把b的值賦予a,如果非0則輸出該值,否則輸出a=0字符串。這種用法在程序中是經常出現的。

if語句的嵌套:

if(表達式1)
  if(表達式2)
   語句1;
  else
    語句2;

這個else究竟是與哪個if配對呢?C語言規定,else總是與他前面最近的if配對

條件運算符和條件表達式

表達式1?表達式2:表達式3

  • a) 條件運算符的運算優先級低于關系運算符和算數運算符,但高于賦值符。因此 max=(a>b)?a:b; 可以寫成 max=a>b?a:b;

  • b) 條件運算符 ?: 是一對運算符,不能分開單獨使用。

  • c)條件運算符的結合方向是自右至左,例如:a>b?a:c>d?c:d 應該理解為 a>b?a:(c>d?c:d) 這也是條件表達式嵌套的情形。

5. switch語句:

switch(表達式) {
case 常量表達式1:語句1;
case 常量表達式2:語句2;
...
case 常量表達式n:語句n;
default:語句n+1;
}

switch語句 中,每個"case 常量表達式"只相當于一個語句標號,表達式的值和某標號相等則轉向該標號執行,但不能在執行完該標號的語句后自動跳出整個switch語句,所以出現了繼續執行所有后面的case語句的情況。
這是與前面介紹的if語句完全不同的,應特別注意。
為了避免上述情況,C語言提供了一種break語句,專門用于跳出switch語句。

在使用switch語句時應注意以下幾點:

  • a)在case后的各常量表達式不能相同,否則出現出錯。
  • b)在case之后,允許有多個語句,可以不用{}括起來。
  • c)各case和default字句的先后順序可以變動,而不會影響程序執行結果。
  • d)default字句可以省略不用。

六、循環控制

  • 1)用goto語句和if語句構成循環
  • 2)while語句
  • 3)do-while
  • 4)for

1. goto語句以及用goto語句構成 循環

使用方法:goto 語句標號;

標號是一個有效的標識符,這個標識符加上一個":"一起出現在函數內某處。
另外,標號必須與goto語句同處于一個函數中,但可以不在一個循環層中。
一般不要使用goto語句,但在多層嵌套退出時,使用goto語句比較合理。
例子:

loop: if (i<100) {
  sum+=i;
  i++;
  goto loop;}

2. while語句

形式: while(表達式) 語句;
使用while時應注意:只要表達式的值為非0,即為真,就一直循環。如:

int a=0,n;
printf("\n input n:   ");
scanf("%d",&n);
while (n--)
  printf("%d ",a++*2);

3. do-while語句形式:

do 
  語句
while(表達式);

同樣,如果有多條語句,需要使用{}括起來。

4. for語句形式:

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

執行過程如下:

  • 1)先求解表達式1
  • 2)再求解表達式2,如果為真,則執行循環體內的語句,否則跳過循環,即跳到第5步
  • 3)執行完循環體內的語句后,求解表達式3
  • 4)回到第2步
  • 5)循環結束

和while對應的就是:

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

使用for注意的是:

  • 1)for循環中的“表達式1”,“表達式2”,“表達式3”都是可選的,即可以缺省,但是;不能缺
  • 2)省略了“表達式1”表示不對循環控制變量賦初值
  • 3)省略了“表達式2”表示死循環
  • 4)省略了“表達式3”則不對循環控制變量進行操作,這時可以在語句體中加入修改循環控制變量的語句。例如:
for (i=1;i<=100;)
{sum+=i;
 i++;}
  • 5)省略了“表達式1”和“表達式3”。例如:
for (;i<=100;)
{sum+=i;
 i++;}
    1. 3個表達式都省略:
for(;;) 語句;
等價于
while(1) 語句;

5. 幾種循環的比較:

  • 1)一般不提倡使用goto語句。
  • 2)while和do-while的循環體中應包括使循環趨于結束的語句。for語句功能最強。
  • 3)用while和do-while循環時,循環變量初始化的操作應在之前完成,而for語句可以在表達式1中實現循環變量的初始化

6. break和continue語句:

(1)break:

  • a)通常break語句總是與if語句聯在一起,即滿足條件時便跳出循環。
  • b)break語句對if-else的條件語句不起作用
  • c)在多層循環中,一個break只向外跳一層。

(2)continue語句

也是通常與if語句一起使用,用來加速循環

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,430評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,134評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,653評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,136評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,372評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,888評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,738評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,179評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,610評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,916評論 2 372

推薦閱讀更多精彩內容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執行單位為行(line),也就是一...
    悟名先生閱讀 4,184評論 0 13
  • 在C語言中,五種基本數據類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,371評論 0 2
  • 指針是C語言中廣泛使用的一種數據類型。 運用指針編程是C語言最主要的風格之一。利用指針變量可以表示各種數據結構; ...
    朱森閱讀 3,462評論 3 44
  • 一、Java 簡介 Java是由Sun Microsystems公司于1995年5月推出的Java面向對象程序設計...
    子非魚_t_閱讀 4,225評論 1 44
  • 今天是中秋節前夕,我的初中朋友老普發請帖給我,他在2015年10月18號結婚。這讓我想起你,我以為我們也會這樣...
    啊嬌嬌嬌嬌嬌閱讀 307評論 0 1