第三章 順序程序設計

章節結構

  • 3.1 順序程序設計舉例數組

  • 3.2 數據的表現形式及其運算函數

    • 3.2.1 常量和變量
      • 常量
      • 變量
      • 常變量
      • 標識符
    • 3.2.2 數據類型
    • 3.2.3 整型數據
      • 整型數據的分類
      • 整型變量的符號屬性
    • 3.2.4 字符型數據
      • 字符與字符代碼
      • 字符變量
    • 3.2.5 浮點型數據
  • 3.3 運算符和表達式ui

    • 3.3.1 C運算符(13種)
    • 3.3.3 自增(++)、自減(--)運算符
    • 3.3.4 算術表達式和運算符的優先級與結合性
    • 3.3.5 不一樣類型數據間的混合運算
    • 3.3.6 強制類型轉換運算符
  • 3.4 C語句設計

    • 3.4.1 C語句的做用和分類
    • 3.4.2 最基本的語句——賦值語句
      • 賦值運算符
      • 複合的賦值運算符
      • 賦值表達式
      • 賦值過程當中的類型轉換
      • 賦值表達式和賦值語句
      • 變量賦初值
  • 3.5 數據的輸入輸出指針

    • 3.5.1 輸入輸出舉例code

    • 3.5.2 有關數據輸入輸出的概念對象

    • 3.5.3 用printf函數輸出數據內存

      • printf函數的通常格式
      • 格式字符
    • 3.5.4 用scanf函數輸入數據字符串

      • scanf函數的通常形式
      • scanf函數中的格式聲明
      • 使用scanf函數時應注意的問題
    • 3.5.5 字符輸入輸出函數get

      • putchar函數輸出一個字符

      • getchar函數輸入一個字符

3.2 數據的表現形式及其運算

3.2.1 常量和變量

常量

常量:在程序運行過程當中,其值不能被改變的量稱爲常量。
常量有5種:整型常量、實型常量(小數形式、指數形式)、字符常量(普通字符、轉義字符)、字符串常量、符號常量(用#define指令,指定一個符號名稱表明一個常量)

  • 普通字符:用單撇號括起來的一個字符,如'a'
    單撇號只是界限符,字符常量只能是一個字符,不包括單撇號。字符常量存儲在計算機存儲單元中時,並非存儲字符自己,而是以其代碼(通常採用ASCII代碼)存儲的。
  • 轉義字符:以字符「"開頭的字符序列,也是一種特殊形式的字符常量 注意下面的形式也是轉義字符的一種
    \0dd\xdd 與八進制/十六進制對應的字符

同時要注意不管是普通字符仍是轉義字符,本質都是字符常量,都必須是以單撇號括起來的形式出現

變量

變量:變量名、變量的值、內存單元  

變量必須先定義,後使用
變量名錶示一個內存地址

常變量

有類型,佔存儲單元但不能改變其值

方法是在定義變量時,前面加一個關鍵字const

標識符

用來對變量、符號常量名、函數、數組、類型等命名的有效字符序列統稱爲標識符

  1. 下劃線、字母、數字。但開頭不能是數字
  2. 大小寫敏感

3.2.2 數據類型

  1. 在計算機中,數據是存放在存儲單元中的,它是具體存在的。並且,存儲單元是由有限的字符構成的,每個存儲單元存放數據的範圍是有限的。

  2. 所謂類型,就是對數據分配存儲單元的安排,包括存儲單元的長度(佔多少字節)以及數據的存儲形式

  3. 不一樣的類型分配不一樣的長度和存儲形式。

  4. 四大類18種

  1. 基本數據類型:整型數據(char、short、int、long、long long、bool)、浮點型數據(double、float、複數浮點型(double_complex、float_complex))、long_complex)    
  2. 枚舉類型(enum):程序中用戶定義的整數類型   
  3. 空類型(void)    
  4. 派生類型:數組、指針、結構體、共用體、函數  

純量類型:算術類型指針類型統稱爲純量類型
算術類型:基本類型(包括整型和浮點型)和枚舉類型變量的值都是數值,統稱爲算術類型。
組合類型:數組類型結構體類型統稱爲組合類型。注意:共用體類型不屬於組合類型,由於在同一時間內只有一個成員具備值。

3.2.3 整型數據

整型數據的分類

4種,基本整型(int)、短整型(short)、長整型(long)、雙長整型(long long)

C標準只要求long型數據長度不短於int型,short型不長於int型。

sizeof(short) <= sizeof(int) <=sizeof(long)<=sizeof(long long)

負數:在計算機內部以補碼形式存儲。 正數的補碼就是此數的二進制形式
負數的補碼:先將此數的絕對值寫成二進制形式,而後對其全部二進制位按位取反加1。
-5的補碼,首先-5的絕對值是55的二進制形式爲0000 0000 0000 0101,按位取反加1後爲1111 11111 1111 11011

編譯系統分配給不一樣的數據類型不一樣大小的存儲單元。1字節 = 8 位。

若給整型變量分配2個字節,其中最高位爲符號位(0表明正數,1表明負數)。則存儲單元中能存放的最大值爲2的15次方 -1,即十進制數32767
最小值爲-2的15次方,即-32768。
所以整型變量的範圍是-32768-32767。超出此範圍,就會出現數值的」溢出「,輸出的結果顯然不正確。

整型變量的符號屬性

unsigned

  • (1)只有整型(包括字符型)數據能夠加signed或unsigned修飾符,實型數據不能加。
  • (2)對無符號整型數據用」%u「格式輸出。%u表示用無符號十進制數的格式輸出。
    在將一個變量定義爲無符號整型後,不該向它賦予一個負值,不然會獲得錯誤的結果

錯誤演示
錯誤的把一個負整數存儲在無符號變量中

unsigned short price = -1;  
printf("%d\n",price);  // 結果是65535 = 2的16次方。顯然與原意不符合

出錯的緣由:

  • 系統對-1先轉換成補碼形式,-1的補碼形式爲1的二進制形式按位取反再加1就是所有二進位都是1,而後把它存入變量price中。
  • 因爲price是無符號短整型變量,其左面第一位不表明符號,按「%d」格式輸出,就是2的16次方,即65535

3.2.4 字符型數據

字符與字符代碼

字符代碼:字符的ASCII代碼

  • 數字字符‘0’~‘9’的ASCII代碼的十進制數爲48~57

  • 大寫字母‘A’~‘Z’的ASCII代碼的十進制數爲65~90

  • 小寫字母‘a’~‘z’的ASCII代碼的十進制數爲97~122

  • 換行字符‘\n’的ASCII代碼的十進制數爲10(line feed換行符)

  • 空格字符‘ ’ 的ASCII代碼的十進制數爲32

  • 專用字符‘% ’ 的ASCII代碼的十進制數爲37

字符'1'和整數1是不一樣的概念
字符’1‘只是表明一個形狀爲’1‘的符號,在須要時按原樣輸出,在內存中以ASCII碼形式存儲,佔1個字節
而整數1是以整數存儲方式(二進制補碼方式)存儲的佔2個或4個字節

字符變量

3.2.5 浮點型數據

單精度浮點型(float)、雙精度浮點型(double)、長雙精度浮點型(long double)

怎樣肯定常量的類型

常量類型5種。
C語言中,的實型常量都做爲雙精度浮點型常量。

類型VS變量

每個變量都屬於一個肯定的類型,類型是變量的一個重要的屬性。變量是佔用存儲單元的,是具體存在的實體,在其佔用的存儲單元中能夠存放數據。
而類型是變量的共性,是抽象的,不佔用存儲單元,不能用來存放數據。

3.3 運算符和表達式

3.3.1 C運算符

13種運算符,42個
「成強 針 長算關位,邏條賦逗」
成員符號運算符2個,指向結構體成員運算符,結構體成員運算符
類型轉換運算符,(類型)
指針運算符2個,指針運算符、取指針運算符
長度運算符,求字節運算符(sizeof)
算術運算符7個,自加、自減、乘、除、取餘、加、減、
關係運算符5個,大於、等於、小於、大於等於、小於等於
位運算符6個,左移、右移、按位取反、按位與、按位異或、按位或
邏輯運算符3個,非、與、或
條件運算符,?: 賦值運算符11個,=、+=、-=、*=、/=、%=、>>=、<<=、&=、^=、| =
逗號運算符(順序求值運算符),逗號
其餘運算符

名稱 符號
算術運算符 ++ -- * / % + -
關係運算符 > < == >= <=
邏輯運算符 !&& ||
位運算符 >> << ~ & ^ |
賦值運算符 =及其擴展運算符(+=、-=、*=、/=、%=)
條件運算符 ?:
逗號運算符 ,
指針運算符 * &
求字節運算符 sizeof
強制類型轉換運算符 (類型)
成員運算符 . ->
下標運算符 []
其餘 如函數調用運算符
  • 多數編譯器在處理整除/ 時,都是向0取整(即取整後向0靠攏),好比說-5 / 3,取-1或-2,可是根據向零取整,則會獲得-1
  • % 要求操做數必須是整數,結果也是整數

3.3.3 自增(++)、自減(--)運算符

前置,則先增後使用 後置,則先使用後增 但兩者結果都相同

3.3.4 算數表達式和運算符的優先級與結合性

在表達式求值時,先按運算符的優先級別順序進行。
若是在一個運算對象兩側的運算符的優先級別相同,則按回定的「結合方向」處理。

  • 優先級
    4個1,圓下兩個結(圓括號、下標、指向結構體成員、結構體成員)
    9個2,

3對針自反,符號強制求長度(邏輯非、按位取反、自加、自減、符號、強制類型轉換、取地址、指針、sizeof)

3個3(* / %)
4加減(+ -)
5左右(左移、右移)
關係6(> >= < <=)
等等7(== !=)
位邏條賦逗(按位與、按位異或、按位或、邏輯與、邏輯或、條件、賦值十一、逗號)

優先級 運算符 含義 要求運算對象的個數 結合方向
1 () [] -> . 圓括號,下標運算符、指向結構體成員運算符、結構體成員運算符 自左至右
2 ! ~ ++ -- - (類型) * & sizeof 邏輯非運算符、按位取反運算符、自增運算符、自減運算符、符號運算符、類型運算符、指針運算符、取地址運算符、長度運算符 單目運算符 自右至左
3 * / % 乘法、除法、取餘 雙目運算符 自左至右
4 + - 加法、減法運算符 雙目運算符 自左至右
5 << >> 左移運算符、右移運算符 雙目運算符 自左至右
6 < <= > >= 關係運算符 雙目運算符 自左至右
7 == != 等於運算符、不等於運算符 雙目運算符 自左至右
8 & 按位與運算符 雙目運算符 自左至右
9 ^ 按位異或運算符 雙目運算符 自左至右
10 | 按位或運算符 雙目運算符 自左至右
11 && 邏輯運算符 雙目運算符 自左至右
12 || 邏輯或運算符 雙目運算符 自左至右
13 ?: 條件運算符 三目運算符 自右至左
14 = += -= *= /= %= >>= <<= &= ^= |= 賦值運算符 雙目運算符 自右至左
15 . 逗號運算符(順序求值運算符) 自左至右
  • 結合性 結合性是C語言的特色之一。 結合性針對的是優先級相同的運算符之間應遵照的規則
    (也能夠是同一個運算符在同一個表達式中出現屢次時應執行的規則)
    • 左結合性:自左至右的結合方向,運算對象先與左邊的運算符結合
    • 右結合性:自右至左的結合方向,運算對象先與右邊的運算符結合(典型的如賦值運算符單目運算符條件運算符,簡稱賦單條

int * a(int x,int y)
()的優先級高於*,所以a先於()結合,顯然這就是個函數形式
這個函數前面有一個*,表示此函數是指針函數(函數值是指針)

3.3.5 不一樣類型數據間的混合運算

三種狀況編譯系統自動完成類型轉換

  • + - * / 運算的操做數有一個爲float或double,先把類型轉換爲double型而後再運算,結果都將是double類型
  • int型與float或double型數據進行運算,先把類型轉換爲double型而後再運算,結果都是double型
  • 字符型數據與整型數據或實型數據進行運算,就是把ASCII代碼與整數運算或實型數據,結果是整型或double型

3.3.6 強制轉換運算符

注意:強制轉運算符也是運算符的一種,所以它描述的是運算過程的現象,且優先級比賦值運算符高。(從這裏能夠看出運算符的優先級的重要性) (類型名) (表達式)
後面的表達式最好用括號括起來。

3.4 C語句

3.4.1 C語句的做用和分類

C語句共五種

  • 控制語句(9種):條件語句(if語句)、循環語句(3種,do...while語句、for語句、while語句)、多分支選擇語句(switch語句)、終止switch或循環語句(break語句)、終止本次循環語句(continue)、返回語句(return)、轉向語句(goto語句)
  • 函數調用語句
  • 表達式語句
  • 空語句
  • 複合語句 (1)控制語句用於完成必定的控制功能
    (2)函數調用語句:由一個函數調用加一個分號構成 (3)表達式語句:由一個表達式加一個分號構成 (4)空語句:只有一個分號 (5)複合語句:用{}把一些語句和聲明括起來稱爲複合語句(又稱爲語句塊

3.4.2 最基本的語句——賦值語句(表達式語句的一種)

賦值運算符

賦值符號=就是賦值運算符
關鍵詞:賦值操做(又稱賦值運算):賦值運算符的做用就是將一個數據賦給一個變量,這種操做就叫賦值操做

複合賦值運算符

賦值符前面加上其餘運算符,就構成符合的運算符,於是能夠進行複合賦值運算
凡是二元(二目)運算符,均可以與賦值符一塊兒組合成符合賦值符

賦值表達式

賦值表達式:有賦值運算符將一個變量和一個表達式鏈接起來的式子
注意:賦值表達式也是表達式的一種 格式: 變量 賦值運算符 表達式
賦值運算符 左側應該是一個可修改值得左值。(常量不能修改,所以不能做爲左值)

賦值過程當中的類型轉換(注意與不一樣類型數據間的混合運算的區別)

若是賦值運算符兩側到的類型不一致,但都是基本類型時,在賦值時要進行類型轉換。類型轉換是由系統自動進行的。
自動轉換五規則
(1)將浮點型數據(包括但、雙精度)賦給整型變量時,先對浮點數取整,即捨棄小數部分,而後賦予整型變量
(2)將整型數據賦給單、雙精度變量時,數值不變,但以浮點數形式存儲到變量中。
(3)將一個double型數據賦給float變量時,先將雙精度數轉換爲單精度,即支取6~7位有效數字,存儲到float型變量的4字節中。
(4) 字符型數據賦給整型數據時,將字符的ASCII代碼賦給整型變量
(5)賦給一個佔字節少的整型變量或字符變量時,只將低字節原封不動地送到被賦值的變量(即發生「截斷「)

例如:把4個字節的int型數據賦給佔2個字節的short變量或佔1個字節的char變量

這些賦值規則的本質:整型數據之間的賦值,按存儲單元的存儲形式直接傳送。實型數據之間以及整型與實型之間的賦值,實型之間的賦值,是先轉換(類型)後賦值

賦值表達式和賦值語句

賦值語句就是賦值表達式加一個分號組成。

  1. 注意if的條件中能夠包含賦值表達式,但不能包含賦值語句
  2. 一個表達式中能夠包含一個或多個賦值表達式,但決不能包含賦值語句

變量賦初值

C語言,給變量賦初值,這種是錯誤的 int a=b=c=3;

3.5 數據的輸入輸出

3.5.1 輸入輸出舉例

3.5.2 有關數據輸入輸出的概念

    1. 所謂輸入輸出是以計算機主機爲主題而言的。
    • 從計算機向輸出設備輸出數據稱爲輸出
    • 向計算機輸入數據稱爲輸入
    1. C語言自己不提供輸入輸出語句。是由C標準函數庫中函數來實現的。
    1. 要在程序文本的開頭用預處理指令#include把有關頭文件放在本程序中
    • 標準方式 #include <頭文件名稱>,編譯系統從存放C編譯系統的子目錄去找所要包含的文件。
    • #include "頭文件名稱":在編譯時,編譯系統先在用戶的當前目錄中尋找要包含的文件,若找不到,再按標準方式查找

3.5.3 用printf函數輸出數據

printf函數的通常格式

printf(格式控制,輸出表列)

  • 格式控制 用雙引號括起來的一個字符串,稱爲格式控制字符串,簡稱格式字符串
    格式聲明普通字符構成
    • 格式聲明:由%格式字符組成,如%d,%f等
      格式聲明的通常形式: % 附加字符 格式字符
      附加字符能夠沒有
      • 格式字符比較負責須要單獨介紹
  • 輸出表列能夠是常量變量或者表達式

格式字符

格式聲明是由%格式字符組成。 經常使用的格式字符

十格八數兩字,XEG可大寫(經常使用格式字符有10個,其中數值類的有8個,字符有2個,一個字符一個字符串;除了XEG能夠大寫,其餘必須小寫)

  • d格式符:用來輸出一個有符號的十進制
  • c格式符:用來輸出一個字符
  • s格式符:用來輸出一個字符串
  • f格式符:用來輸出實數
    • 基本型%f,通常狀況是實數中的整數部分所有輸出,小數部分輸出6位
    • 指定數據寬度和小數位數,用%m.nf(注意:這裏表示輸出的數據佔m列,其中包括n位小數,即m已經把n計算在內了)
    • 輸出的數據向左對齊%-m.nf(左對齊,位數不夠,在右邊填充空格)
      默認右對齊,若是有-符號,則左對齊。+不表明右對齊,會當成普通字符輸出。
    • 若是須要輸出double型數據可使用格式符號lf

    輸入雙精度型變量的值要用格式聲明「%lf」
    float 型數據小數點後是6個有效數字,
    double類數據小數點後是15個有效數字

  • e格式符:用格式聲明%e指定以指數形式輸出實數
  • 其餘格式符:i(按照十進制整型數據實際長度輸出);o格式字符(八進制整數形式)、x格式符(十六進制整數形式)、u(無符號十進制)、g(浮點數,自動選f格式或e格式,不輸出無心義的0)

格式字符:數值類8個 d u i of XEG,2個(一個字符,一個字符串)。

printf函數中的格式附加字符

4個格式附加字符

格式附加字符 說明
l 長整型整數,可加在格式符d、o、x、u前面
m(表明一個正整數) 數據最小寬度
n(表明一個正整數) 對實數,表示輸出n位小數;對字符串,表示截取的字符個數
- 輸出的數字或字符在域內向左靠

printf函數的5點說明

  1. printf函數輸出時,務必注意輸出對象的類型應與上述格式說明匹配,不然將會出現錯誤
  2. 除了XEG外,其餘格式字符必須用小寫字母,如~~%d不能寫成%D~~
  3. 能夠在printf函數中的格式控制字符串內包含轉義字符,如\n,\t,\b,\r,\f和\377等
  4. 一個格式聲明是以%開頭,以duioxfegXEGcs等12個格式字符之一結束,中間能夠插入附加格式字符(或稱爲修飾符);注意printf函數使用輸出表列替換格式字符,可是普通字符會被原樣輸出
  5. 在printf函數中輸出百分號%,應該在格式控制字符串中用連續兩個%表示便可

3.5.4 用scanf函數輸入數據

scanf函數的通常形式

scanf(格式控制,地址聲明)

scanf函數中的格式聲明

格式字符

同printf函數
有一個須要注意的地方,s |格式字符|說明| |:----------:|:---------:| |s|輸入字符串,將字符串送到一個字符數組中,在輸入時以非空白字符開始,以第一個空白字符結束。字符串以串結束標誌'\0'做爲其最後一個字符|

格式附加字符(又稱修飾符)
字符 說明
l 輸入長整型數據(可用%ld,%lo,%lu,%lx)以及double型數據(用%lf或%le)
h 輸入短整型數據(可用%hd,%ho,%hx)
域寬 指定輸入數據所佔寬度(列數),域寬應爲正整數
* 本輸入項在讀入後不賦給相應的變量
注意:scanf函數中的格式附加字符有 * 表示本輸入項在讀入後不賦給相應的變量

使用scanf函數時應注意的問題

  1. scanf函數中的格式控制後面應當是變量地址,而不是變量名
  2. 若是在格式控制字符串中除了格式聲明之外還有其餘字符,則在輸入數據時在對應的位置上也要輸入這些字符
  3. 在用「%c」格式聲明輸入字符時,空格字符換行字符中的字符都做爲有效字符輸入(意思就是說空格和enter鍵都會被捕捉到,做爲scanf函數的參數)

即用%c時,鍵盤輸入的空格字符換行字符都會當作scanf函數中的地址聲明
這裏容易出現的一個錯誤就是,原本做爲分割意義的空格字符和換行字符,被用來替換格式字符了,這會形成格式字符的個數和實際捕捉到的地址聲明個數不一致,

  1. 在輸入數值數據時,如輸入空格、回車、Tab鍵或者是非法字符(不屬於數值的字符),則表示該數據結束

scanf("%d%c%f",&a,&b,&c);
若輸入1234a123u.26此處按下回車鍵 此時 %d對應1234%c對應a%f對應123
後面的字符沒有被讀入

scanf函數經常使用的格式說明(補充)

  1. 在格式串中,必須含有與輸入項一一對應的格式轉換說明符
  2. 在VC6.0環境下,輸入short型整數的格式控制符要求%hd
  3. 在scanf()函數的格式字符前能夠加入一個正整數指定輸入數據所佔的寬度,但不能夠對實數指定小數位的寬度
  4. 輸入是一個字符流,scanf()函數從這個流中按照格式控制指定的格式解析出相應數據,送到指定的地址變量中,所以當數據少於輸入項時,運行程序將等待輸入,直到知足輸入要求爲止;當輸入數據多於輸入項時,多餘的數據在輸入流中沒有做廢,等待下一個輸入操做語句繼續從輸入流讀取數據
  5. scanf()函數返回值是本次scanf()函數調用正確輸入的數據項的個數

3.5.5 字符輸入輸出函數

轉義字符

轉移字符,分爲兩部分組成,反斜槓\ASCII碼值
其中ASCII碼值能夠是十進制或者八進制或者十六進制

  • 不管是用哪種數製表示,數值範圍應該與ASCII碼值範圍一致。 目前標準的ASCII碼值範圍在0~127
  • 若用十進制則格式爲\ddd八進制則格式爲\odd十六進制則格式爲\xdd

putchar函數輸出一個字符

字符輸出函數
putchar(c) // 在計算機顯示屏上顯示變量c的值
c是2常2變(有條件的整型變量),能夠是字符常量、整型常量、字符變量或 整型變量(要求其值在字符的ASCII代碼範圍內)

getchar函數輸入一個字符

字符輸入函數
getchar() 從計算機終端輸入一個字符。getchar()函數值就是獲得的那個字符

getchar函數不只能夠從輸入設備得到一個可顯示的字符,並且能夠得到在屏幕上沒法顯示的字符,如控制字符

用getchar函數獲得的字符能夠賦值給一個字符變量或整型變量;也能夠直接做爲表達式的一部分

...
char a;
a = getchar(); //從鍵盤輸入一個字符,送給字符變量a
putchar(a); // 將變量a的值輸出

getchar函數的一個問題

getchar()函數不只能夠從輸入設備得到一個可顯示的字符,並且能夠得到在屏幕上沒法顯示的字符,如控制字符(好比換行符)
這會容易發生一些意料以外的問題。特別是在連續多個getchar()語句,此時會把一些空格符號或回車也做爲一個字符輸入

在使用getchar和putchar函數時注意字符與字符串(字符數組)的區別

getchar()從輸入設備獲取一個字符,putchar(char)輸出一個字符
而strlwr等函數處理的是字符串和字符數組,
所以若要使它們之間產生聯繫,就涉及到字符如何轉換成字符數組的問題

要使得單個字符轉換成字符串,注意必須將字符數組長度定爲2,由於包括字符串結尾符'\0'

char a,b[2];

a = getchar();
b[0] = a;
printf("%s",strlwr(b));
相關文章
相關標籤/搜索