章節結構
-
3.1 順序程序設計舉例數組
-
3.2 數據的表現形式及其運算函數
- 3.2.1 常量和變量
- 常量
- 變量
- 常變量
- 標識符
- 3.2.2 數據類型
- 3.2.3 整型數據
- 整型數據的分類
- 整型變量的符號屬性
- 3.2.4 字符型數據
- 字符與字符代碼
- 字符變量
- 3.2.5 浮點型數據
- 3.2.1 常量和變量
-
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
標識符
用來對變量、符號常量名、函數、數組、類型等命名的有效字符序列統稱爲標識符
- 下劃線、字母、數字。但開頭不能是數字
- 大小寫敏感
3.2.2 數據類型
-
在計算機中,數據是存放在存儲單元中的,它是具體存在的。並且,存儲單元是由有限的字符構成的,每個存儲單元存放數據的範圍是有限的。
-
所謂類型,就是對數據分配存儲單元的安排,包括存儲單元的長度(佔多少字節)以及數據的存儲形式。
-
不一樣的類型分配不一樣的長度和存儲形式。
-
四大類18種
- 基本數據類型:整型數據(char、short、int、long、long long、bool)、浮點型數據(double、float、複數浮點型(double_complex、float_complex))、long_complex)
- 枚舉類型(enum):程序中用戶定義的整數類型
- 空類型(void)
- 派生類型:數組、指針、結構體、共用體、函數
純量類型:算術類型和指針類型統稱爲純量類型
算術類型:基本類型(包括整型和浮點型)和枚舉類型變量的值都是數值,統稱爲算術類型。
組合類型:數組類型和結構體類型統稱爲組合類型。注意:共用體類型不屬於組合類型,由於在同一時間內只有一個成員具備值。
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
的絕對值是5
,5
的二進制形式爲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變量
這些賦值規則的本質:整型數據之間的賦值,按存儲單元的存儲形式直接傳送。實型數據之間以及整型與實型之間的賦值,實型之間的賦值,是先轉換(類型)後賦值
賦值表達式和賦值語句
賦值語句就是賦值表達式加一個分號組成。
- 注意if的條件中能夠包含賦值表達式,但不能包含賦值語句。
- 一個表達式中能夠包含一個或多個賦值表達式,但決不能包含賦值語句
變量賦初值
C語言,給變量賦初值,這種是錯誤的 int a=b=c=3;
3.5 數據的輸入輸出
3.5.1 輸入輸出舉例
3.5.2 有關數據輸入輸出的概念
-
- 所謂輸入輸出是以計算機主機爲主題而言的。
- 從計算機向輸出設備輸出數據稱爲輸出
- 向計算機輸入數據稱爲輸入
-
- C語言自己不提供輸入輸出語句。是由C標準函數庫中函數來實現的。
-
- 要在程序文本的開頭用預處理指令#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點說明
- printf函數輸出時,務必注意輸出對象的類型應與上述格式說明匹配,不然將會出現錯誤
- 除了XEG外,其餘格式字符必須用小寫字母,如~~%d不能寫成%D~~
- 能夠在printf函數中的格式控制字符串內包含轉義字符,如\n,\t,\b,\r,\f和\377等
- 一個格式聲明是以%開頭,以duioxfegXEGcs等12個格式字符之一結束,中間能夠插入附加格式字符(或稱爲修飾符);注意printf函數使用輸出表列替換格式字符,可是普通字符會被原樣輸出
- 在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函數時應注意的問題
- scanf函數中的格式控制後面應當是變量地址,而不是變量名
- 若是在格式控制字符串中除了格式聲明之外還有其餘字符,則在輸入數據時在對應的位置上也要輸入這些字符
- 在用「%c」格式聲明輸入字符時,空格字符和換行字符中的字符都做爲有效字符輸入(意思就是說空格和enter鍵都會被捕捉到,做爲scanf函數的參數)
即用%c時,鍵盤輸入的空格字符和換行字符都會當作scanf函數中的地址聲明
這裏容易出現的一個錯誤就是,原本做爲分割意義的空格字符和換行字符,被用來替換格式字符了,這會形成格式字符的個數和實際捕捉到的地址聲明個數不一致,
- 在輸入數值數據時,如輸入空格、回車、Tab鍵或者是非法字符(不屬於數值的字符),則表示該數據結束
scanf("%d%c%f",&a,&b,&c);
若輸入1234a123u.26此處按下回車鍵
此時 %d對應1234
,%c
對應a
,%f
對應123
,
後面的字符沒有被讀入
scanf函數經常使用的格式說明(補充)
- 在格式串中,必須含有與輸入項一一對應的格式轉換說明符
- 在VC6.0環境下,輸入short型整數的格式控制符要求
%hd
- 在scanf()函數的格式字符前能夠加入一個正整數指定輸入數據所佔的寬度,但不能夠對實數指定小數位的寬度
- 輸入是一個字符流,scanf()函數從這個流中按照格式控制指定的格式解析出相應數據,送到指定的地址變量中,所以當數據少於輸入項時,運行程序將等待輸入,直到知足輸入要求爲止;當輸入數據多於輸入項時,多餘的數據在輸入流中沒有做廢,等待下一個輸入操做語句繼續從輸入流讀取數據
- 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));