C程序设计语言——基础概念
C語言從入門到精通
每天進(jìn)步一點(diǎn)點(diǎn),日積月累。
紙上得來終覺淺,絕知此事要躬行。
C 語言概述
為什么學(xué)習(xí)C語言
C語言的起源和發(fā)展
結(jié)構(gòu)化語言:使得它的數(shù)據(jù)和操作是分離的
面向?qū)ο笳Z言
速度:C>C++>Java
C語言的特點(diǎn)
優(yōu)點(diǎn):代碼量小、速度快、功能強(qiáng)大
windows C內(nèi)核 C++外包
Unix C
linux C
缺點(diǎn):危險(xiǎn)性高、開發(fā)周期長、可移植性不強(qiáng)
C語言的應(yīng)用領(lǐng)域
系統(tǒng)軟件開發(fā)
應(yīng)用軟件開發(fā)
模塊化程序設(shè)計(jì)思想
在設(shè)計(jì)較復(fù)雜的程序時(shí),一般采用自頂向下的方法,將問題劃分為幾個(gè)部分,各個(gè)部分再進(jìn)行細(xì)化,直到分解為較好解決問題為止。
模塊化設(shè)計(jì),簡單地說就是程序的編寫不是一開始就逐條錄入計(jì)算機(jī)語句和指令,而是首先用主程序、子程序、子過程等框架把軟件的主要結(jié)構(gòu)和流程描述出來,并定義和調(diào)試好各個(gè)框架之間的輸入、輸出鏈接關(guān)系逐步求精的結(jié)果是得到一系列以功能塊為單位的算法描述。以功能塊為單位進(jìn)行程序設(shè)計(jì),實(shí)現(xiàn)其求解算法的方法稱為模塊化。
模塊化的目的是為了降低程序復(fù)雜度,使程序設(shè)計(jì)、調(diào)試和維護(hù)等操作簡單化。
利用函數(shù),不僅可以實(shí)現(xiàn)程序的模塊化,使得程序設(shè)計(jì)更加簡單和直觀,從而提高了程序的易讀性和可維護(hù)性,而且還可以把程序中經(jīng)常用到的一些計(jì)算或操作編寫成通用函數(shù),以供隨時(shí)調(diào)用
舉例:
C語言編程預(yù)備知識
CPU、內(nèi)存條、硬盤、顯卡、主板、顯示器之間的關(guān)系
某雙擊硬盤上存放的文件(視頻,音頻),單擊后操作系統(tǒng)將硬盤上數(shù)據(jù)調(diào)入內(nèi)存條中,CPU去處理內(nèi)存條中數(shù)據(jù),圖像的話通過顯卡在顯示器顯示。
程序如何運(yùn)行起來
文本編譯軟件上寫完程序后,點(diǎn)擊編譯(Compiler)、鏈接(Linker)之后Visual C++生成 .exe可執(zhí)行文件,再點(diǎn)擊運(yùn)行(Built)之后,Visual C++請求OS去調(diào)用CPU執(zhí)行 .exe文件。
編譯:由編譯程序?qū)τ脩粼闯绦蜻M(jìn)行編譯,形成若干個(gè)目標(biāo)模塊(Object Module)。
鏈接:由鏈接程序?qū)⒕幾g后形成的一組目標(biāo)模塊以及它們所需要的庫函數(shù)鏈接在一起,形成一個(gè)完整的裝入模塊(Load Module)。
裝入:由裝入程序?qū)⒀b入模塊裝入內(nèi)存。
編譯預(yù)處理
-
定義
#開頭的是編譯預(yù)處理指令,它們不是C語言成分,但是C語言離不開它們 -
宏定義
#define 宏名 替換文本#define PI 3.14159在C語言編譯器開始編譯前,編譯預(yù)處理程序會把程序中的名字替換成值
不帶參數(shù)的宏定義帶參數(shù)的宏定義
#define 宏名 (參數(shù)表) 字符串#define RADTODEG ((x)*57.29)
標(biāo)識符
命名規(guī)則:只能由字母與數(shù)字、下劃線組成第一個(gè)字符必須是字母或下劃線區(qū)分字母大小寫不能是C語言關(guān)鍵字分類:關(guān)鍵字預(yù)定義標(biāo)識符用戶標(biāo)識符什么是數(shù)據(jù)類型
什么是變量
變量的本質(zhì):是內(nèi)存中一段存儲空間,不同類型的變量其存儲單元大小不同
定義:值可以改變的量
存儲單元里存放的是該變量的值
變量要有變量名,在使用前必須先定義
變量的數(shù)據(jù)類型:
字符型數(shù)據(jù)與整型數(shù)據(jù)之間可以通用,一個(gè)字符能用字符的形式輸出,也能用整數(shù)的形式輸出(字符的本質(zhì)上是代表一個(gè)十進(jìn)制整數(shù))
變量的運(yùn)算:
字符數(shù)據(jù)進(jìn)行算術(shù)運(yùn)算,相當(dāng)于對他們的ASCII碼進(jìn)行運(yùn)算 /* 字母轉(zhuǎn)換來理解字符變量的運(yùn)算過程 以下為小寫字符轉(zhuǎn)換為大寫字符 */#include <stdio.h>int main(void) {char ch;scanf("%c", &ch);//方式一 printf("%c\n", ch-32);//由于字符本質(zhì)就是使用ASCII碼的十進(jìn)制整數(shù)進(jìn)行存儲,所以可以直接運(yùn)算//方式二printf("%c\n", ch-'\x20');//十六進(jìn)制的'\x20'表示十進(jìn)制32所代表的字符 //方式三printf("%c\n", ch-' ');//空格字符' '表示十進(jìn)制的32 return 0; }總結(jié):
C語言并無char類型,就是用Int表示char的!char占一個(gè)字節(jié),在C語言所有類型中最小。
在C語言中,實(shí)際上字符型數(shù)據(jù)在內(nèi)存中是以二進(jìn)制形式存放的,并不是真正的把一個(gè)字符存進(jìn)內(nèi)存里。在對字符型數(shù)據(jù)進(jìn)行相加減運(yùn)算的時(shí)候,系統(tǒng)會首先會將char型數(shù)據(jù)以隱形的方式轉(zhuǎn)化成int型數(shù)據(jù)再進(jìn)行相加減運(yùn)算的。因此,由字符型數(shù)據(jù)在內(nèi)存的存儲方式來看,字符型數(shù)據(jù)是可以進(jìn)行數(shù)值運(yùn)算的,對字符型數(shù)據(jù)做數(shù)字運(yùn)算實(shí)際上就是對字符本身對應(yīng)的ASCII碼進(jìn)行相應(yīng)的數(shù)值運(yùn)算。
“ 整型”和“字符型”可以互相轉(zhuǎn)換:
(char)整型變量=字符型變量(int)字符型變量=整型變量變量為什么必須初始化(賦值)
軟件運(yùn)行期間,軟件所占的內(nèi)存空間不再分配給其他軟件,當(dāng)軟件運(yùn)行完畢后,OS將回收內(nèi)存空間(OS并不清空該內(nèi)存空間遺留下的數(shù)據(jù))
如何定義變量
數(shù)據(jù)類型 變量名=要賦的值
(int price = 10;)
進(jìn)制
什么叫進(jìn)制
十進(jìn)制就是逢十進(jìn)一:0 1 2 3 4 5 6 7 8 9 10 11二進(jìn)制就是逢二進(jìn)一:0 1 10 11 100 101 110 111十六進(jìn)制就是逢十六進(jìn)一:0 1 2 3 4 5 6 7 8 9 A B C D E F進(jìn)制轉(zhuǎn)換的預(yù)備知識
把r進(jìn)制轉(zhuǎn)換為十進(jìn)制
把十進(jìn)制轉(zhuǎn)換成r進(jìn)制
1. 把十進(jìn)制轉(zhuǎn)換為二進(jìn)制
2. 把十進(jìn)制轉(zhuǎn)換為八進(jìn)制
3. 把十進(jìn)制轉(zhuǎn)換為十六進(jìn)制
十進(jìn)制轉(zhuǎn)r進(jìn)制方法:除r取余,直至商為0,余數(shù)倒敘排列
二進(jìn)制與十六進(jìn)制轉(zhuǎn)換
一個(gè)十六進(jìn)制位必須用4個(gè)二進(jìn)制位表示 一個(gè)八進(jìn)制為必須用是三個(gè)二進(jìn)制位表示不同進(jìn)制所代表的的數(shù)值之間的關(guān)系
十進(jìn)制的3981轉(zhuǎn)換為十六進(jìn)制是F8D十進(jìn)制的3981和十六進(jìn)制的F8D所代表的本質(zhì)上都是同一個(gè)數(shù)C語言規(guī)定八進(jìn)制前加:0
C語言規(guī)定十六進(jìn)制前加:0X
二進(jìn)制的101和十進(jìn)制的5,本質(zhì)上是一樣的,只是外部形式不同。
常用計(jì)數(shù)制對照表
同一個(gè)值不同的進(jìn)制表示形式不同
什么是常量
在程序運(yùn)行中,其值不能被改變的量。
常量在C語言中如何表示
在字符集中,有一類字符具有這樣的特性:當(dāng)從鍵盤上輸入這個(gè)字符時(shí),顯示器上 就可以顯示這個(gè)字符,即輸入什么就顯示什么。這類字符稱為可顯示字符,如a、b、c、$、+和空格符等都是可顯示字符。
另一類字符卻沒有這種特性。它們或者在鍵盤上找不到對應(yīng)的一個(gè)鍵(當(dāng)然可以用特殊方式輸入),或者當(dāng)按鍵以后不能顯示鍵面上的字符。其實(shí),這類字符是為控制作用而設(shè)計(jì)的,故稱為控制字符。 在C語言中,構(gòu)成字符常量的控制字符必須用轉(zhuǎn)義字符表示。
通常使用轉(zhuǎn)義字符表示ASCII碼字符集中不可打印的控制字符和特定功能的字符,下表是常用的轉(zhuǎn)義字符及其含義。
| \a | 響鈴(BEL) | 007 |
| \b | 退格(BS) ,將當(dāng)前位置移到前一列 | 008 |
| \f | 換頁(FF),將當(dāng)前位置移到下頁開頭 | 012 |
| \n | 換行(LF) ,將當(dāng)前位置移到下一行開頭 | 010 |
| \r | 回車(CR) ,將當(dāng)前位置移到本行開頭 | 013 |
| \t | 水平制表(HT) (跳到下一個(gè)TAB位置) | 009 |
| \v | 垂直制表(VT) | 011 |
| \|代表一個(gè)反斜線字符’ \ ’ | 092 | |
| \’ | 代表一個(gè)單引號(撇號)字符 | 039 |
| \" | 代表一個(gè)雙引號字符 | 034 |
| \0 | 空字符(NULL) | 000 |
| \ddd | 1到3位八進(jìn)制數(shù)所代表的任意字符 | 3位八進(jìn)制 |
| \xhh | 1到2位十六進(jìn)制所代表的任意字符 | 2位十六進(jìn)制 |
由上可知,使用八進(jìn)制轉(zhuǎn)義字符和十六進(jìn)制轉(zhuǎn)義字符,不僅可以表示控制字符,而且也可以表示可顯示字符。但由于不同的計(jì)算機(jī)系統(tǒng)上采用的字符集可能不同,因此,為了能使所編寫的程序可以方便地移植到其他的計(jì)算機(jī)系統(tǒng)上運(yùn)行,程序中應(yīng)少用這種形式的轉(zhuǎn)義字符。
常量以什么樣的二進(jìn)制代碼存儲在計(jì)算機(jī)中
整數(shù)以補(bǔ)碼的形式轉(zhuǎn)化為二進(jìn)制代碼存儲在計(jì)算機(jī)中的。
實(shí)數(shù)以IEEE754標(biāo)準(zhǔn)轉(zhuǎn)化為二進(jìn)制代碼存儲在計(jì)算機(jī)中的。
字符的本質(zhì)實(shí)際也是與整數(shù)的存儲方式相同。
代碼規(guī)范化
推薦閱讀《高質(zhì)量程序設(shè)計(jì)指南C/C++編修》
讓別人和自己更容易可讀和理解
什么是字節(jié)
字節(jié)就是存儲數(shù)據(jù)的單位,并且是硬件所能訪問的最小單位。
1字節(jié)(Byte) = 8位(Bit)
什么是ASCII碼
ASCII不是一個(gè)值,而是一種規(guī)定。
ASCII規(guī)定了不同的字符是使用哪一種整數(shù)值去表示。
GB2312和UTF-8規(guī)定不同字母用什么數(shù)字表示。
運(yùn)算符和表達(dá)式
-
算術(shù)運(yùn)算符:+,-,*,/,%
-
除法/的運(yùn)算結(jié)果和運(yùn)算對象的數(shù)據(jù)類型有關(guān)
兩數(shù)都是int,則商是int除數(shù)和被除數(shù)只要有一個(gè)/兩個(gè)是浮點(diǎn)數(shù),則商是浮點(diǎn)型 -
取余%的運(yùn)算對象:兩個(gè)操作數(shù)必須是整數(shù)(int類型),結(jié)果是整除后的余數(shù)
其余數(shù)的符號與被除數(shù)相同例如:13%-3==1;-13%3==-1;3%5==3;-3%5==-3;1%25=1當(dāng)被余數(shù)小于余數(shù)時(shí),結(jié)果就是被余數(shù)舉例:要得到一個(gè)三位數(shù)456的個(gè)位、十位、百位個(gè)位數(shù):456%10=6十位數(shù):456/10%10=5百位數(shù):456/10=4 -
關(guān)系運(yùn)算符:>,<,>=,<=,!=,==
-
位運(yùn)算符:>>,<<,~,&,|,^
-
&——按位與
1&1 = 11&0 = 00&1 = 00&0 = 0 #include <stdio.h>int main(void) {int i = 5;int j = 7;int k;k = i&j; //表示5的二進(jìn)制0101與7的二進(jìn)制0111相與,結(jié)果是0101還是5printf("%d\n", k);k = i&&j;printf("%d\n", k); //k的值只能是1或0,因?yàn)?amp;&是邏輯運(yùn)算符 return 0; } //結(jié)果為:51 -------------------------------- -
|——按位或
1|0 = 11|1 = 10|1 = 10|0 = 0例如:5|2等價(jià)于00000101|00000010,結(jié)果為00000111 #include <stdio.h>int main(void) {int i = 3;int j = 5;int k;k = i | j;printf("%d\n", k);return 0;//結(jié)果: 7 -------------------------------- } -
~——按位取反
~i就是把i變量所有的二進(jìn)制位取反 -
^——按位異或
規(guī)則是參與運(yùn)算的兩個(gè)運(yùn)算符中相對應(yīng)的二進(jìn)制位上,若數(shù)相同,則該位的結(jié)果為0,否則為1相同位0,不同位11^0 = 10^1 = 11^1 = 00^0 = 1例如:s=32,s^=32,printf("%d", s), 相同為假不同為真,結(jié)果是03^2等價(jià)于00000011^00000010,結(jié)果為00000001,十進(jìn)制是1 -
<<——按位左移
i<<1表示把i的所有二進(jìn)制位左移一位,右邊補(bǔ)0.左移n位相當(dāng)于乘以2的n次方例:i = i * 8i = i << 3 速度快 -
>>——按位右移
i>>3表示把i的所有二進(jìn)制位右移3,左邊一般都是0有移n位表示除以2的n次方(不能溢出導(dǎo)致數(shù)據(jù)丟失)位運(yùn)算符的現(xiàn)實(shí)意義:通過位運(yùn)算符我們可以對數(shù)據(jù)的操作精確到每一位
-
邏輯運(yùn)算符:!,||,&&
-
C語言對真假處理
非0是真 真表示10是假 假是0表示例如:(!a == 0)<==> ((!a) == 0)因?yàn)?的優(yōu)先級高于== 它表示是a不等于0時(shí)為真(a == !0)表示的是a等于1的時(shí)候?yàn)檎? -
C語言真假判斷
&&左邊的表達(dá)式為假,右邊的表達(dá)式肯定不執(zhí)行||左邊的表達(dá)式為真,右邊的表達(dá)式肯定不執(zhí)行 -
&&邏輯與也叫并且
-
邏輯運(yùn)算符的結(jié)果只能是0或1
-
條件運(yùn)算符:?:
格式:A ? B : C 等價(jià)于 if(A) //當(dāng)表達(dá)式A為真,執(zhí)行表達(dá)式BB;else //當(dāng)表達(dá)式A為假,執(zhí)行表達(dá)式CC; -
指針運(yùn)算符:&,*
-
賦值運(yùn)算符:=
作用:將一個(gè)數(shù)值賦值給一個(gè)變量或?qū)⒁粋€(gè)變量的值賦給另一個(gè)變量。
賦值表達(dá)式一般形式:變量名=表達(dá)式/變量/值
注:左邊不能是表達(dá)式,右邊可以是賦值表達(dá)式a+b=c 錯誤的a=b=7+1 正確的a=7+1=b 錯誤的復(fù)合賦值表達(dá)式:+=、-=、*=、/=、%=
例子:t *= sum +12 <==> t = t * (sum + 12)x-=x+x <==> x=x-(x+x) +的優(yōu)先級高于-=5=4+1錯誤,常量5不能被賦值舉例:已有變量a=9,計(jì)算表達(dá)式a+=a-=a+a的值1. 先計(jì)算a+a=182. 計(jì)算a-=18(此時(shí)a任然是9) a=a-18,a變?yōu)?93. 計(jì)算a+=-9(此時(shí)a是-9) a=a+-9 ,a變?yōu)?18 -
逗號運(yùn)算符:,
逗號表達(dá)式:用逗號運(yùn)算符將幾個(gè)表達(dá)式連接起來格式:A;B;C;D;……功能:從左到右依次執(zhí)行,最終表達(dá)式的值是最后一項(xiàng)的值例如:j=2;i=(j++,++j,j+2,j-3) 最終i=3(i=3,i++,++i,i+5)從左向右計(jì)算,i++之后i為4,++i之后i為5,i+5之后值為10,所以表達(dá)式的值為10,i為5 -
字節(jié)運(yùn)算符:sizeof
sizeof(類型):是靜態(tài)得到字節(jié)數(shù),不會影響下面語句 -
強(qiáng)制運(yùn)算符:(類型名)(表達(dá)式)
利用強(qiáng)制類型轉(zhuǎn)換符將一個(gè)表達(dá)式轉(zhuǎn)換為前面所執(zhí)行的數(shù)據(jù)類型一般形式:(類型名)(表達(dá)式)例子:(float)(5) 最終值為5.000000 -
初等運(yùn)算符:圓括號(),下標(biāo)運(yùn)算符[ ],結(jié)構(gòu)體成員運(yùn)算符->
-
單目、雙目、三目運(yùn)算符
單目就是這個(gè)運(yùn)算符只對一個(gè)變量進(jìn)行操作代表符號:!(邏輯非) ,~(按位取反),++(自增),--(自減)雙目就是這個(gè)運(yùn)算符對兩個(gè)變量進(jìn)行操作三目就是這個(gè)運(yùn)算符對三個(gè)變量進(jìn)行操作代表符號: ?: (條件運(yùn)算符) -
自增、自減運(yùn)算符
作用:自增運(yùn)算符++,使運(yùn)算變量的值增1,自減運(yùn)算符--,使運(yùn)算變量值減一均是單目運(yùn)算符分類:前自增++i,后自增i++相同點(diǎn):最終都使i的值加一不同點(diǎn):前自增整體表達(dá)式的值是i加1之后的值;后自增整體表達(dá)式的值是i加1之前的值注意:for循環(huán)條件語句中出現(xiàn)++i或者i++都是一樣的,沒有區(qū)別,因?yàn)闂l件語句for(i++; ; )中是執(zhí)行完第一個(gè)條件之后,再執(zhí)行第二個(gè)條件語句與賦值運(yùn)算符=不同,例子:
int a = 10;printf(a++) = 10;printf(a) = 11;printf(++a) = 12;printf(a) = 12;visit(*p++); 第一次先輸出*p,下一次才輸出*p+1compare(*p++, e)是先比較*p與e的值,第二次才是用*p+1和e的值進(jìn)行比較k++是先取K的值再將k的值自增1 為什么會出現(xiàn)自增:1. 代碼更精煉2. 自增的速度更快 i++>i=i+1學(xué)習(xí)自增前要明白的幾個(gè)問題1. 我們編程是應(yīng)該盡量屏蔽掉前自增和后自增的區(qū)別2. i++和++i單獨(dú)成一個(gè)語句,不要把它作為一個(gè)完整復(fù)合語句的一部分使用。
運(yùn)算符的優(yōu)先級和結(jié)合性
優(yōu)先級:初等>單目>算術(shù)>關(guān)系>邏輯>條件>賦值>逗號
結(jié)合性:左結(jié)合性->單目,條件,賦值,擴(kuò)展;其余右結(jié)合性
圖示運(yùn)算符優(yōu)先級和結(jié)合性
最高級:出現(xiàn)同級別運(yùn)算符時(shí)的結(jié)合方向是從左往右
第二級:這一級都是單目運(yùn)算符號,這一級的結(jié)合方向是從右向左。
出現(xiàn) * p++,這時(shí) * 和++同級別,先算右邊,再左邊。所以 * p++等價(jià)于 * (p++)
第三級:這一級都是算術(shù)運(yùn)算符,結(jié)合順序和數(shù)學(xué)學(xué)習(xí)中一致的,先乘除取余數(shù),后加減。
第四級:這是左移、右移運(yùn)算符,位運(yùn)算時(shí)可能需要用到。
第六級:這三個(gè)符號也是位運(yùn)算符號,其中內(nèi)優(yōu)先級,&>^>|。
第七級:邏輯與&&優(yōu)先級大于邏輯或||。
第八級:也稱為條件運(yùn)算符號,是C語言中唯一的一個(gè)三目運(yùn)算符,結(jié)合順序是從右往左。
第九級:這些運(yùn)算符也叫做賦值運(yùn)算符,除此之外,>>=、<<=、&=、^=、|=這些賦值運(yùn)算符也在這一級別內(nèi),結(jié)合順序是從右往左。
最低級:逗號運(yùn)算符也稱為順序求值運(yùn)算符,在C語言中,運(yùn)算級別最低。
表達(dá)式
C語言一些瑣碎的知識
浮點(diǎn)數(shù)的存儲所帶來的的問題
float和double都不能保證可以精確的存儲一個(gè)小數(shù)。
為什么循環(huán)中更新的變量不能定義為浮點(diǎn)型呢
因?yàn)楦↑c(diǎn)型不一定能準(zhǔn)確存儲。二進(jìn)制全部為0的含義——0000000…00000的含義
-
表示數(shù)值零
-
表示字符串結(jié)束標(biāo)記 ‘\0’
-
空指針NULL
NULL本質(zhì)也是0,而這個(gè)零不代表數(shù)字零,而表示的是內(nèi)存單元的編號為零(表示0地址,即編號為零)我們計(jì)算機(jī)規(guī)定了,以零為編號的存儲單元的內(nèi)容不可讀,不可寫 -
0地址
在現(xiàn)代OS中,多進(jìn)程中,OS給程序虛擬地址空間,所有程序在運(yùn)行時(shí)都以為自己從0開始的一片連續(xù)空間(32位機(jī)器,頂是4G)一般0地址不能碰的,在這種情況下,用0地址表示特殊事情1. 返回指針無效2. 用NULL表示0地址
什么叫分配內(nèi)存,什么叫釋放內(nèi)存
分配內(nèi)存:
OS把某一塊內(nèi)存空間的使用權(quán)限分配給該程序釋放內(nèi)存:
OS把分配給該程序的內(nèi)存空間的使用權(quán)限收回,該程序不能夠再使用這一塊內(nèi)存空間注:釋放內(nèi)存不是把該內(nèi)存的內(nèi)容清零變量為什么必須得初始化
不初始化,則變量通常就是垃圾值
總結(jié)
以上是生活随笔為你收集整理的C程序设计语言——基础概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用友NC CLOUD 工具
- 下一篇: 数学分析练习题答案一(自己做的)