C基礎(chǔ)講義_第1頁(yè)
C基礎(chǔ)講義_第2頁(yè)
C基礎(chǔ)講義_第3頁(yè)
C基礎(chǔ)講義_第4頁(yè)
C基礎(chǔ)講義_第5頁(yè)
已閱讀5頁(yè),還剩147頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Easy搞定C語(yǔ)言(基礎(chǔ)篇)1. C語(yǔ)言概述1.1 什么是C語(yǔ)言一提到語(yǔ)言這個(gè)詞語(yǔ),自然會(huì)想到的是像英語(yǔ)、漢語(yǔ)等這樣的自然語(yǔ)言,因?yàn)樗侨撕腿私粨Q信息不可缺少的工具。而今天計(jì)算機(jī)遍布了我們生活的每一個(gè)角落,除了人和人的相互交流之外,我們必須和計(jì)算機(jī)角落。用什么的什么樣的方式和計(jì)算機(jī)做最直接的交流呢?人們自然想到的是最古老也最方便的方式語(yǔ)言,而C語(yǔ)言就是人和計(jì)算機(jī)交流的一種語(yǔ)言。語(yǔ)言是用來(lái)交流溝通的。有一方說(shuō),有另一方聽(tīng),必須有兩方參與,這是語(yǔ)言最重要的功能:l 說(shuō)的一方傳遞信息,聽(tīng)的一方接收信息;l 說(shuō)的一方下達(dá)指令,聽(tīng)的一方遵循命令做事情。語(yǔ)言是人和人交流,C語(yǔ)言是人和機(jī)器交流。只是,人可以不聽(tīng)另外一個(gè)人,但是,計(jì)算機(jī)是無(wú)條件服從。語(yǔ)言有獨(dú)特的語(yǔ)法規(guī)則和定義,雙方必須遵循這些規(guī)則和定義才能實(shí)現(xiàn)真正的交流。1.2 計(jì)算機(jī)介紹1.2.1 計(jì)算機(jī)結(jié)構(gòu)組成1.2.2 計(jì)算機(jī)系統(tǒng)組成1.2.3 程序和指令l 指令是對(duì)計(jì)算機(jī)進(jìn)行程序控制的最小單位。l 所有的指令的集合稱為計(jì)算機(jī)的指令系統(tǒng)。l 程序是為完成一項(xiàng)特定任務(wù)而用某種語(yǔ)言編寫(xiě)的一組指令序列。1.3 語(yǔ)言發(fā)展歷程1.3.1 機(jī)器語(yǔ)言計(jì)算機(jī)的大腦或者說(shuō)心臟就是CPU,它控制著整個(gè)計(jì)算機(jī)的運(yùn)作。每種CPU,都有自己的指令系統(tǒng)。這個(gè)指令系統(tǒng),就是該CPU的機(jī)器語(yǔ)言。機(jī)器語(yǔ)言是一組由0和1系列組成的指令碼,這些指令碼,是CPU制作廠商規(guī)定出來(lái)的,然后發(fā)布出來(lái),請(qǐng)程序員遵守。要讓計(jì)算機(jī)干活,就得用機(jī)器語(yǔ)言(二級(jí)制數(shù))去命令它。這樣的命令,不是一條兩條,而是上百條。而且不同型號(hào)的計(jì)算機(jī)其機(jī)器語(yǔ)言是不相通的,按著一種計(jì)算機(jī)的機(jī)器指令編制的程序,不能在另一種計(jì)算機(jī)上執(zhí)行。1.3.2 匯編語(yǔ)言和編譯器機(jī)器語(yǔ)言編程是不是很令人煩惱呢,終于出現(xiàn)了匯編語(yǔ)言,就是一些標(biāo)識(shí)符取代0與1。一門(mén)人類(lèi)可以比較輕松認(rèn)識(shí)的編程語(yǔ)言。只是這門(mén)語(yǔ)言計(jì)算機(jī)并不認(rèn)識(shí),所以人類(lèi)還不能用這門(mén)語(yǔ)言命令計(jì)算機(jī)做事情。這正如如何才能讓中國(guó)人說(shuō)的話美國(guó)人明白呢?翻譯!所以,有一類(lèi)專門(mén)的程序,既認(rèn)識(shí)機(jī)器語(yǔ)言,又認(rèn)識(shí)匯編語(yǔ)言,也就是編譯器,將標(biāo)識(shí)符換成0與1,知道怎么把匯編語(yǔ)言翻譯成機(jī)器語(yǔ)言。1.3.3 高級(jí)語(yǔ)言匯編語(yǔ)言和機(jī)器語(yǔ)言都是面向機(jī)器的,機(jī)器不同,語(yǔ)言也不同。既然有辦法讓匯編語(yǔ)言翻譯成機(jī)器語(yǔ)言,難道就不能把其他更人性化的語(yǔ)言翻譯成機(jī)器語(yǔ)言?1954年,F(xiàn)ortran語(yǔ)言出現(xiàn)了,其后相繼出現(xiàn)了其他的類(lèi)似語(yǔ)言。這批語(yǔ)言,使程序員擺脫了計(jì)算機(jī)硬件的限制,把主要精力放在了程序設(shè)計(jì)上,不在關(guān)注低層的計(jì)算機(jī)硬件。這類(lèi)語(yǔ)言,稱為高級(jí)語(yǔ)言。同樣的,高級(jí)語(yǔ)言要被計(jì)算機(jī)執(zhí)行,也需要一個(gè)翻譯程序?qū)⑵浞g成機(jī)器語(yǔ)言,這就是編譯程序,簡(jiǎn)稱編譯器。這類(lèi)高級(jí)語(yǔ)言解決問(wèn)題的方法是分析出解決問(wèn)題所需要的步驟,把程序看作是數(shù)據(jù)被加工的過(guò)程?;谶@類(lèi)方法的程序設(shè)計(jì)語(yǔ)言成為面向過(guò)程的語(yǔ)言。C語(yǔ)言就是這種面向過(guò)程的程序設(shè)計(jì)語(yǔ)言。1.3.4 語(yǔ)言的層次1.3.5 語(yǔ)言進(jìn)化史1.4 為什么要學(xué)習(xí)C語(yǔ)言1.4.1 C語(yǔ)言特點(diǎn)1) 優(yōu)點(diǎn)n 代碼量小n 執(zhí)行速度快n 功能強(qiáng)大n 編程自由2) 缺點(diǎn)n 寫(xiě)代碼實(shí)現(xiàn)周期長(zhǎng)n 可移植性較差n 過(guò)于自由,經(jīng)驗(yàn)不足易出錯(cuò)n 對(duì)平臺(tái)庫(kù)依賴較多1.4.2 學(xué)習(xí)C語(yǔ)言理由1.4.3 C語(yǔ)言應(yīng)用領(lǐng)域C語(yǔ)言的應(yīng)用極其廣泛,從網(wǎng)站后臺(tái),到底層操作系統(tǒng),從多媒體應(yīng)用到大型網(wǎng)絡(luò)游戲,均可使用C語(yǔ)言來(lái)開(kāi)發(fā):l C語(yǔ)言可以寫(xiě)網(wǎng)站后臺(tái)程序l C語(yǔ)言可以專門(mén)針對(duì)某個(gè)主題寫(xiě)出功能強(qiáng)大的程序庫(kù)l C語(yǔ)言可以寫(xiě)出大型游戲的引擎l C語(yǔ)言可以寫(xiě)出另一個(gè)語(yǔ)言來(lái)l C語(yǔ)言可以寫(xiě)操作系統(tǒng)和驅(qū)動(dòng)程序,并且只能用C語(yǔ)言編寫(xiě)l 任何設(shè)備只要配置了微處理器,就都支持C語(yǔ)言。從微波爐到手機(jī),都是由C語(yǔ)言技術(shù)來(lái)推動(dòng)的1.4.4 C語(yǔ)言的簡(jiǎn)潔C語(yǔ)言僅有32個(gè)關(guān)鍵字,9種控制語(yǔ)句,34種運(yùn)算符,卻能完成無(wú)數(shù)的功能:1.4.5 學(xué)習(xí)C語(yǔ)言的常見(jiàn)困惑1.5 第一個(gè)C語(yǔ)言程序:HelloWorld1.5.1 編寫(xiě)C語(yǔ)言代碼:hello.c#include int main()/這是第一個(gè)C語(yǔ)言代碼printf(hello worldn);return 0;C語(yǔ)言的源代碼文件是一個(gè)普通的文本文件,但擴(kuò)展名必須是.c。1.5.2 通過(guò)gcc編譯C代碼1) gcc編譯器介紹編輯器(如vi、記事本)是指我用它來(lái)寫(xiě)程序的(編輯代碼),而我們寫(xiě)的代碼語(yǔ)句,電腦是不懂的,我們需要把它轉(zhuǎn)成電腦能懂的語(yǔ)句,編譯器就是這樣的轉(zhuǎn)化工具。就是說(shuō),我們用編輯器編寫(xiě)程序,由編譯器編譯后才可以運(yùn)行!編譯器是將易于編寫(xiě)、閱讀和維護(hù)的高級(jí)計(jì)算機(jī)語(yǔ)言翻譯為計(jì)算機(jī)能解讀、運(yùn)行的低級(jí)機(jī)器語(yǔ)言的程序。gcc(GNU Compiler Collection,GNU 編譯器套件),是由 GNU 開(kāi)發(fā)的編程語(yǔ)言編譯器。gcc原本作為GNU操作系統(tǒng)的官方編譯器,現(xiàn)已被大多數(shù)類(lèi)Unix操作系統(tǒng)(如Linux、BSD、Mac OS X等)采納為標(biāo)準(zhǔn)的編譯器,gcc同樣適用于微軟的Windows。gcc最初用于編譯C語(yǔ)言,隨著項(xiàng)目的發(fā)展gcc已經(jīng)成為了能夠編譯C、C+、Java、Ada、fortran、Object C、Object C+、Go語(yǔ)言的編譯器大家族。編譯命令格式:gcc -option1 . g+ -option1 . l 命令、選項(xiàng)和源文件之間使用空格分隔l 一行命令中可以有零個(gè)、一個(gè)或多個(gè)選項(xiàng)l 文件名可以包含文件的絕對(duì)路徑,也可以使用相對(duì)路徑l 如果命令中不包含輸出可執(zhí)行文件的文件名,可執(zhí)行文件的文件名會(huì)自動(dòng)生成一個(gè)默認(rèn)名,Linux平臺(tái)為a.out,Windows平臺(tái)為a.exegcc、g+編譯常用選項(xiàng)說(shuō)明:選項(xiàng) 含義-o file指定生成的輸出文件名為file-E只進(jìn)行預(yù)處理-S(大寫(xiě))只進(jìn)行預(yù)處理和編譯-c(小寫(xiě))只進(jìn)行預(yù)處理、編譯和匯編2) Linux平臺(tái)下編譯代碼l gcc warning的意思是警告,是有問(wèn)題,但不影響編譯l error是錯(cuò)誤,如果遇到error,那么就不能編譯了3) Windows平臺(tái)下gcc環(huán)境配置windows命令行界面下,默認(rèn)是沒(méi)有g(shù)cc編譯器,我們需要配置一下環(huán)境。由于我們安裝了Qt,Qt是一個(gè)集成開(kāi)發(fā)環(huán)境,內(nèi)部集成gcc編譯器,配置一下環(huán)境變量即可使用gcc。a) 進(jìn)入Qt安裝目錄:b) 拷貝gcc所在的路徑(不同安裝目錄有所差異)C:QtQt5.5.0Toolsmingw492_32binc) 設(shè)置windows環(huán)境變量計(jì)算機(jī)(右擊) 屬性:如果是win7,雙擊Path后,把拷貝的路徑追加到后面,路徑之間需要英文” ; ”分隔:如果是win10,界面做得友好一下,新建添加路徑即可:d)測(cè)試gcc命令:4) Windows平臺(tái)下編譯代碼5) 注意事項(xiàng)Linux編譯后的可執(zhí)行程序只能在Linux運(yùn)行,Windows編譯后的程序只能在Windows下運(yùn)行。64位的Linux編譯后的程序只能在64位Linux下運(yùn)行,32位Linux編譯后的程序只能在32位的Linux運(yùn)行。64位的Windows編譯后的程序只能在64位Windows下運(yùn)行,32位Windows編譯后的程序可以在64位的Windows運(yùn)行。1.5.3 代碼分析1) include頭文件包含l #include的意思是頭文件包含,#include 代表包含stdio.h這個(gè)頭文件l 使用C語(yǔ)言庫(kù)函數(shù)需要提前包含庫(kù)函數(shù)對(duì)應(yīng)的頭文件,如這里使用了printf()函數(shù),需要包含stdio.h頭文件l 可以通過(guò)man 3 printf查看printf所需的頭文件#include 與 #include 的區(qū)別:l 表示系統(tǒng)直接按系統(tǒng)指定的目錄檢索l 表示系統(tǒng)先在 指定的路徑(沒(méi)寫(xiě)路徑代表當(dāng)前路徑)查找頭文件,如果找不到,再按系統(tǒng)指定的目錄檢索stdio.h是在操作系統(tǒng)的系統(tǒng)目錄下:2) main函數(shù)l 一個(gè)完整的C語(yǔ)言程序,是由一個(gè)、且只能有一個(gè)main()函數(shù)(又稱主函數(shù),必須有)和若干個(gè)其他函數(shù)結(jié)合而成(可選)。l main函數(shù)是C語(yǔ)言程序的入口,程序是從main函數(shù)開(kāi)始執(zhí)行。3) 括號(hào),程序體和代碼塊l 叫代碼塊,一個(gè)代碼塊內(nèi)部可以有一條或者多條語(yǔ)句l C語(yǔ)言每句可執(zhí)行代碼都是;分號(hào)結(jié)尾l 所有的#開(kāi)頭的行,都代表預(yù)編譯指令,預(yù)編譯指令行結(jié)尾是沒(méi)有分號(hào)的l 所有的可執(zhí)行語(yǔ)句必須是在代碼塊里面4) 注釋l /叫行注釋,注釋的內(nèi)容編譯器是忽略的,注釋主要的作用是在代碼中加一些說(shuō)明和解釋,這樣有利于代碼的閱讀l /*/叫塊注釋l 塊注釋是C語(yǔ)言標(biāo)準(zhǔn)的注釋方法l 行注釋是從C+語(yǔ)言借鑒過(guò)來(lái)的5) printf函數(shù)l printf是C語(yǔ)言庫(kù)函數(shù),功能是向標(biāo)準(zhǔn)輸出設(shè)備輸出一個(gè)字符串l printf(“hello worldn”);/n的意思是回車(chē)換行6) return語(yǔ)句l return代表函數(shù)執(zhí)行完畢,返回return代表函數(shù)的終止l 如果main定義的時(shí)候前面是int,那么return后面就需要寫(xiě)一個(gè)整數(shù);如果main定義的時(shí)候前面是void,那么return后面什么也不需要寫(xiě)l 在main函數(shù)中return 0代表程序執(zhí)行成功,return -1代表程序執(zhí)行失敗l int main()和void main()在C語(yǔ)言中是一樣的,但C+只接受int main這種定義方式1.6 system函數(shù)1.6.1 system函數(shù)的使用#include int system(const char *command);功能:在已經(jīng)運(yùn)行的程序中執(zhí)行另外一個(gè)外部程序參數(shù):外部可執(zhí)行程序名字返回值:成功:不同系統(tǒng)返回值不一樣失敗:通常是 - 1示例代碼:#include #include int main()/system(calc); /windows平臺(tái)system(ls); /Linux平臺(tái), 需要頭文件#include return 0;1.6.2 system返回值不同系統(tǒng)結(jié)果不一樣C語(yǔ)言所有的庫(kù)函數(shù)調(diào)用,只能保證語(yǔ)法是一致的,但不能保證執(zhí)行結(jié)果是一致的,同樣的庫(kù)函數(shù)在不同的操作系統(tǒng)下執(zhí)行結(jié)果可能是一樣的,也可能是不一樣的。在學(xué)習(xí)Linux發(fā)展史時(shí),我們得知Linux的發(fā)展離不開(kāi)POSIX標(biāo)準(zhǔn),只要符合這個(gè)標(biāo)準(zhǔn)的函數(shù),在不同的系統(tǒng)下執(zhí)行的結(jié)果就可以一致。Unix和linux很多庫(kù)函數(shù)都是支持POSIX的,但Windows支持的比較差。如果將Unix代碼移植到Linux一般代價(jià)很小,如果把Windows代碼移植到Unix或者Linux就比較麻煩。1.6.3 Qt圖形界面調(diào)用systemvoid Widget:on_pushButton_clicked() /system(calc); /需要頭文件:#include WinExec(calc, SW_NORMAL); /需要頭文件:#include void Widget:on_pushButton_2_clicked() system(notepad);void Widget:on_pushButton_3_clicked() system(mmc);1.6.4 MFC圖形界面調(diào)用systemvoid CvssystemDlg:OnBnClickedButton1()/ TODO: 在此添加控件通知處理程序代碼/WinExec(calc, SW_NORMAL); 需要頭文件:#include system(calc); /需要頭文件:#include void CvssystemDlg:OnBnClickedButton2()/ TODO: 在此添加控件通知處理程序代碼/WinExec(notepad, SW_NORMAL);system(notepad);1.7 C語(yǔ)言編譯過(guò)程1.7.1 C程序編譯步驟C代碼編譯成可執(zhí)行程序經(jīng)過(guò)4步:1) 預(yù)處理:宏定義展開(kāi)、頭文件展開(kāi)、條件編譯等,同時(shí)將代碼中的注釋刪除,這里并不會(huì)檢查語(yǔ)法2) 編譯:檢查語(yǔ)法,將預(yù)處理后文件編譯生成匯編文件3) 匯編:將匯編文件生成目標(biāo)文件(二進(jìn)制文件)4) 鏈接:C語(yǔ)言寫(xiě)的程序是需要依賴各種庫(kù)的,所以編譯之后還需要把庫(kù)鏈接到最終的可執(zhí)行程序中去1.7.2 gcc編譯過(guò)程1) 分步編譯預(yù)處理:gcc -E hello.c -o hello.i編 譯:gcc -S hello.i -o hello.s匯 編:gcc -c hello.s -o hello.o鏈 接:gcc hello.o -o hello_elf選項(xiàng)含義-E只進(jìn)行預(yù)處理-S(大寫(xiě))只進(jìn)行預(yù)處理和編譯-c(小寫(xiě))只進(jìn)行預(yù)處理、編譯和匯編-o file指定生成的輸出文件名為 file文件后綴含義.cC 語(yǔ)言文件.i預(yù)處理后的 C 語(yǔ)言文件.s編譯后的匯編文件.o編譯后的目標(biāo)文件2) 一步編譯gcc hello.c -o demo(還是經(jīng)過(guò):預(yù)處理、編譯、匯編、鏈接的過(guò)程):1.7.3 查找程序所依賴的動(dòng)態(tài)庫(kù)1) Linux平臺(tái)下,ldd(“l(fā)”為字母) 可執(zhí)行程序:2) Windows平臺(tái)下,需要相應(yīng)軟件(Depends.exe):1.8 CPU內(nèi)部結(jié)構(gòu)與寄存器(了解)1.8.1 64位和32位系統(tǒng)區(qū)別l 寄存器是CPU內(nèi)部最基本的存儲(chǔ)單元l CPU對(duì)外是通過(guò)總線(地址、控制、數(shù)據(jù))來(lái)和外部設(shè)備交互的,總線的寬度是8位,同時(shí)CPU的寄存器也是8位,那么這個(gè)CPU就叫8位CPUl 如果總線是32位,寄存器也是32位的,那么這個(gè)CPU就是32位CPUl 有一種CPU內(nèi)部的寄存器是32位的,但總線是16位,準(zhǔn)32位CPUl 所有的64位CPU兼容32位的指令,32位要兼容16位的指令,所以在64位的CPU上是可以識(shí)別32位的指令l 在64位的CPU構(gòu)架上運(yùn)行了64位的軟件操作系統(tǒng),那么這個(gè)系統(tǒng)是64位l 在64位的CPU構(gòu)架上,運(yùn)行了32位的軟件操作系統(tǒng),那么這個(gè)系統(tǒng)就是32位l 64位的軟件不能運(yùn)行在32位的CPU之上1.8.2 寄存器名字(了解)8位16位32位64位AAXEAXRAXBBXEBXRBXCCXECXRCXDDXEDXRDX1.8.3 寄存器、緩存、內(nèi)存三者關(guān)系按與CPU遠(yuǎn)近來(lái)分,離得最近的是寄存器,然后緩存(CPU緩存),最后內(nèi)存。CPU計(jì)算時(shí),先預(yù)先把要用的數(shù)據(jù)從硬盤(pán)讀到內(nèi)存,然后再把即將要用的數(shù)據(jù)讀到寄存器。于是 CPU寄存器內(nèi)存,這就是它們之間的信息交換。那為什么有緩存呢?因?yàn)槿绻鲜遣僮鲀?nèi)存中的同一址地的數(shù)據(jù),就會(huì)影響速度。于是就在寄存器與內(nèi)存之間設(shè)置一個(gè)緩存。因?yàn)閺木彺嫣崛〉乃俣冗h(yuǎn)高于內(nèi)存。當(dāng)然緩存的價(jià)格肯定遠(yuǎn)遠(yuǎn)高于內(nèi)存,不然的話,機(jī)器里就沒(méi)有內(nèi)存的存在。由此可以看出,從遠(yuǎn)近來(lái)看:CPU-寄存器- 緩存 內(nèi)存。1.9 匯編語(yǔ)言1.9.1 VS中C語(yǔ)言嵌套匯編代碼(了解)#include int main()/定義整型變量a, b, cint a;int b;int c;_asmmov a, 3/3的值放在a對(duì)應(yīng)內(nèi)存的位置mov b, 4/4的值放在a對(duì)應(yīng)內(nèi)存的位置mov eax, a/把a(bǔ)內(nèi)存的值放在eax寄存器add eax, b/eax和b相加,結(jié)果放在eaxmov c, eax/eax的值放在c中printf(%dn, c);/把c的值輸出return 0;/成功完成1.9.2 VS反匯編#include int main()/定義整型變量a, b, cint a;int b;int c;a = 3;b = 4;c = a + b;printf(%dn, c);/把c的值輸出return 0;/成功完成1) 設(shè)置斷點(diǎn)F92) 選擇反匯編按鈕3) 根據(jù)匯編代碼分析程序1.10 集成開(kāi)發(fā)環(huán)境IDE集成開(kāi)發(fā)環(huán)境(IDE,Integrated Development Environment )是用于提供程序開(kāi)發(fā)環(huán)境的應(yīng)用程序,一般包括代碼編輯器、編譯器、調(diào)試器和圖形用戶界面工具。集成了代碼編寫(xiě)功能、分析功能、編譯功能、調(diào)試功能等一體化的開(kāi)發(fā)軟件服務(wù)套。所有具備這一特性的軟件或者軟件套(組)都可以叫集成開(kāi)發(fā)環(huán)境。1.10.1 Qt CreatorQt Creator是跨平臺(tái)的 Qt IDE, Qt Creator 是 Qt 被 Nokia 收購(gòu)后推出的一款新的輕量級(jí)集成開(kāi)發(fā)環(huán)境(IDE)。此 IDE 能夠跨平臺(tái)運(yùn)行,支持的系統(tǒng)包括 Linux(32 位及 64 位)、Mac OS X 以及 Windows。根據(jù)官方描述,Qt Creator 的設(shè)計(jì)目標(biāo)是使開(kāi)發(fā)人員能夠利用 Qt 這個(gè)應(yīng)用程序框架更加快速及輕易的完成開(kāi)發(fā)任務(wù)??旖萱I含義Ctrl + i自動(dòng)格式化代碼Ctrl + /注釋/取消注釋Alt + Enter自動(dòng)完成類(lèi)函數(shù)定義F4.h 文件和對(duì)應(yīng).cpp 文件切換F9設(shè)置斷點(diǎn)F5調(diào)試運(yùn)行Ctrl + r編譯,但不調(diào)試運(yùn)行Ctrl + b編譯,不運(yùn)行F10next調(diào)試F11step調(diào)試1.10.2 Microsoft Visual StudioMicrosoft Visual Studio(簡(jiǎn)稱VS)是美國(guó)微軟公司的開(kāi)發(fā)工具包系列產(chǎn)品。VS是一個(gè)基本完整的開(kāi)發(fā)工具集,它包括了整個(gè)軟件生命周期中所需要的大部分工具,如UML工具、代碼管控工具、集成開(kāi)發(fā)環(huán)境(IDE)等等,所寫(xiě)的目標(biāo)代碼適用于微軟支持的所有平臺(tái)。Visual Studio是目前最流行的Windows平臺(tái)應(yīng)用程序的集成開(kāi)發(fā)環(huán)境。1) VS常用快捷鍵快捷鍵含義Ctrl + k,Ctrl + f自動(dòng)格式化代碼Ctrl + k,Ctrl + c注釋代碼Ctrl + k,Ctrl + u取消注釋代碼F9設(shè)置斷點(diǎn)F5調(diào)試運(yùn)行Ctrl + F5不調(diào)試運(yùn)行Ctrl + Shift + b編譯,不運(yùn)行F10next調(diào)試F11step調(diào)試2) VS2013的C4996錯(cuò)誤由于微軟在VS2013中不建議再使用C的傳統(tǒng)庫(kù)函數(shù)scanf,strcpy,sprintf等,所以直接使用這些庫(kù)函數(shù)會(huì)提示C4996錯(cuò)誤:VS建議采用帶_s的函數(shù),如scanf_s、strcpy_s,但這些并不是標(biāo)準(zhǔn)C函數(shù)。要想繼續(xù)使用此函數(shù),需要在源文件中添加以下指令就可以避免這個(gè)錯(cuò)誤提示:#define _CRT_SECURE_NO_WARNINGS /這個(gè)宏定義最好要放到.c文件的第一行#pragma warning(disable:4996)/或者使用這個(gè)2. 數(shù)據(jù)類(lèi)型2.1 常量與變量2.1.1 關(guān)鍵字2.1.2 數(shù)據(jù)類(lèi)型數(shù)據(jù)類(lèi)型的作用:編譯器預(yù)算對(duì)象(變量)分配的內(nèi)存空間大小。2.1.3 常量常量:l 在程序運(yùn)行過(guò)程中,其值不能被改變的量l 常量一般出現(xiàn)在表達(dá)式或賦值語(yǔ)句中整型常量100,200,-100,0實(shí)型常量3.14 , 0.125,-3.123字符型常量a,b,1,n字符串常量“a”,“ab”,“12356”2.1.4 變量1) 變量變量:l 在程序運(yùn)行過(guò)程中,其值可以改變l 變量在使用前必須先定義,定義變量前必須有相應(yīng)的數(shù)據(jù)類(lèi)型標(biāo)識(shí)符命名規(guī)則:l 標(biāo)識(shí)符不能是關(guān)鍵字l 標(biāo)識(shí)符只能由字母、數(shù)字、下劃線組成l 第一個(gè)字符必須為字母或下劃線l 標(biāo)識(shí)符中字母區(qū)分大小寫(xiě)變量特點(diǎn):l 變量在編譯時(shí)為其分配相應(yīng)的內(nèi)存空間l 可以通過(guò)其名字和地址訪問(wèn)相應(yīng)內(nèi)存2) 聲明和定義區(qū)別l 聲明變量不需要建立存儲(chǔ)空間,如:extern int a;l 定義變量需要建立存儲(chǔ)空間,如:int b;#include int main()/extern 關(guān)鍵字只做聲明,不能做任何定義,后面還會(huì)學(xué)習(xí),這里先了解/聲明一個(gè)變量a,a在這里沒(méi)有建立存儲(chǔ)空間extern int a;a = 10;/err, 沒(méi)有空間,就不可以賦值int b = 10;/定義一個(gè)變量b,b的類(lèi)型為int,b賦值為10return 0;從廣義的角度來(lái)講聲明中包含著定義,即定義是聲明的一個(gè)特例,所以并非所有的聲明都是定義:l int b 它既是聲明,同時(shí)又是定義l 對(duì)于 extern b來(lái)講它只是聲明不是定義一般的情況下,把建立存儲(chǔ)空間的聲明稱之為“定義”,而把不需要建立存儲(chǔ)空間的聲明稱之為“聲明”。2.1.5 使用示例#include #define MAX 10 /聲明了一個(gè)常量,名字叫MAX,值是10,常量的值一旦初始化不可改int main()int a;/定義了一個(gè)變量,其類(lèi)型為int,名字叫aconst int b = 10; /定義一個(gè)const常量,名為叫b,值為10/b = 11; /err,常量的值不能改變/MAX = 100;/err,常量的值不能改變a = MAX;/將abc的值設(shè)置為MAX的值a = 123;printf(%dn, a); /打印變量a的值return 0;2.2 進(jìn)制進(jìn)制也就是進(jìn)位制,是人們規(guī)定的一種進(jìn)位方法。 對(duì)于任何一種進(jìn)制X進(jìn)制,就表示某一位置上的數(shù)運(yùn)算時(shí)是逢X進(jìn)一位。 十進(jìn)制是逢十進(jìn)一,十六進(jìn)制是逢十六進(jìn)一,二進(jìn)制就是逢二進(jìn)一,以此類(lèi)推,x進(jìn)制就是逢x進(jìn)位。十進(jìn)制二進(jìn)制八進(jìn)制十六進(jìn)制000011112102231133410044510155611066711177810001089100111910101012A11101113B12110014C13110115D14111016E15111117F161000020102.2.1 二進(jìn)制二進(jìn)制是計(jì)算技術(shù)中廣泛采用的一種數(shù)制。二進(jìn)制數(shù)據(jù)是用0和1兩個(gè)數(shù)碼來(lái)表示的數(shù)。它的基數(shù)為2,進(jìn)位規(guī)則是“逢二進(jìn)一”,借位規(guī)則是“借一當(dāng)二”。當(dāng)前的計(jì)算機(jī)系統(tǒng)使用的基本上是二進(jìn)制系統(tǒng),數(shù)據(jù)在計(jì)算機(jī)中主要是以補(bǔ)碼的形式存儲(chǔ)的。術(shù)語(yǔ)含義bit(比特)一個(gè)二進(jìn)制代表一位,一個(gè)位只能表示0或1兩種狀態(tài)。數(shù)據(jù)傳輸是習(xí)慣以“位”(bit)為單位。Byte(字節(jié))一個(gè)字節(jié)為8個(gè)二進(jìn)制,稱為8位,計(jì)算機(jī)中存儲(chǔ)的最小單位是字節(jié)。數(shù)據(jù)存儲(chǔ)是習(xí)慣以“字節(jié)”(Byte)為單位。WORD(雙字節(jié))2個(gè)字節(jié),16位DWORD兩個(gè)WORD,4個(gè)字節(jié),32位1b1bit,1位1B1Byte,1字節(jié),8位1k,1K10241M(1兆)1024k, 1024*10241G1024M1T1024G1Kb(千位)1024bit,1024位1KB(千字節(jié))1024Byte,1024字節(jié)1Mb(兆位)1024Kb = 1024 * 1024bit1MB(兆字節(jié))1024KB = 1024 * 1024Byte十進(jìn)制轉(zhuǎn)化二進(jìn)制的方法:用十進(jìn)制數(shù)除以2,分別取余數(shù)和商數(shù),商數(shù)為0的時(shí)候,將余數(shù)倒著數(shù)就是轉(zhuǎn)化后的結(jié)果。十進(jìn)制的小數(shù)轉(zhuǎn)換成二進(jìn)制:小數(shù)部分和2相乘,取整數(shù),不足1取0,每次相乘都是小數(shù)部分,順序看取整后的數(shù)就是轉(zhuǎn)化后的結(jié)果。2.2.2 八進(jìn)制八進(jìn)制,Octal,縮寫(xiě)OCT或O,一種以8為基數(shù)的計(jì)數(shù)法,采用0,1,2,3,4,5,6,7八個(gè)數(shù)字,逢八進(jìn)1。一些編程語(yǔ)言中常常以數(shù)字0開(kāi)始表明該數(shù)字是八進(jìn)制。八進(jìn)制的數(shù)和二進(jìn)制數(shù)可以按位對(duì)應(yīng)(八進(jìn)制一位對(duì)應(yīng)二進(jìn)制三位),因此常應(yīng)用在計(jì)算機(jī)語(yǔ)言中。十進(jìn)制轉(zhuǎn)化八進(jìn)制的方法:用十進(jìn)制數(shù)除以8,分別取余數(shù)和商數(shù),商數(shù)為0的時(shí)候,將余數(shù)倒著數(shù)就是轉(zhuǎn)化后的結(jié)果。2.2.3 十六進(jìn)制十六進(jìn)制(英文名稱:Hexadecimal),同我們?nèi)粘I钪械谋硎痉ú灰粯?,它?-9,A-F組成,字母不區(qū)分大小寫(xiě)。與10進(jìn)制的對(duì)應(yīng)關(guān)系是:0-9對(duì)應(yīng)0-9,A-F對(duì)應(yīng)10-15。十六進(jìn)制的數(shù)和二進(jìn)制數(shù)可以按位對(duì)應(yīng)(十六進(jìn)制一位對(duì)應(yīng)二進(jìn)制四位),因此常應(yīng)用在計(jì)算機(jī)語(yǔ)言中。十進(jìn)制轉(zhuǎn)化十六進(jìn)制的方法:用十進(jìn)制數(shù)除以16,分別取余數(shù)和商數(shù),商數(shù)為0的時(shí)候,將余數(shù)倒著數(shù)就是轉(zhuǎn)化后的結(jié)果。2.2.4 C語(yǔ)言如何表示相應(yīng)進(jìn)制數(shù)十進(jìn)制以正常數(shù)字1-9開(kāi)頭,如123八進(jìn)制以數(shù)字0開(kāi)頭,如0123十六進(jìn)制以0x開(kāi)頭,如0x123二進(jìn)制C語(yǔ)言不能直接書(shū)寫(xiě)二進(jìn)制數(shù)#include int main()int a = 123;/十進(jìn)制方式賦值int b = 0123;/八進(jìn)制方式賦值, 以數(shù)字0開(kāi)頭int c = 0xABC;/十六進(jìn)制方式賦值/如果在printf中輸出一個(gè)十進(jìn)制數(shù)那么用%d,八進(jìn)制用%o,十六進(jìn)制是%xprintf(十進(jìn)制:%dn,a );printf(八進(jìn)制:%on, b);/%o,為字母o,不是數(shù)字printf(十六進(jìn)制:%xn, c);return 0;2.3 計(jì)算機(jī)內(nèi)存數(shù)值存儲(chǔ)方式2.3.1 原碼一個(gè)數(shù)的原碼(原始的二進(jìn)制碼)有如下特點(diǎn):l 最高位做為符號(hào)位,0表示正,為1表示負(fù)l 其它數(shù)值部分就是數(shù)值本身絕對(duì)值的二進(jìn)制數(shù)l 負(fù)數(shù)的原碼是在其絕對(duì)值的基礎(chǔ)上,最高位變?yōu)?下面數(shù)值以1字節(jié)的大小描述:十進(jìn)制數(shù)原碼+150000 1111-151000 1111+00000 0000-01000 0000原碼表示法簡(jiǎn)單易懂,與帶符號(hào)數(shù)本身轉(zhuǎn)換方便,只要符號(hào)還原即可,但當(dāng)兩個(gè)正數(shù)相減或不同符號(hào)數(shù)相加時(shí),必須比較兩個(gè)數(shù)哪個(gè)絕對(duì)值大,才能決定誰(shuí)減誰(shuí),才能確定結(jié)果是正還是負(fù),所以原碼不便于加減運(yùn)算。2.3.2 反碼l 對(duì)于正數(shù),反碼與原碼相同l 對(duì)于負(fù)數(shù),符號(hào)位不變,其它部分取反(1變0,0變1)十進(jìn)制數(shù)反碼+150000 1111-151111 0000+00000 0000-01111 1111反碼運(yùn)算也不方便,通常用來(lái)作為求補(bǔ)碼的中間過(guò)渡。2.3.3 補(bǔ)碼在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來(lái)存儲(chǔ)。補(bǔ)碼特點(diǎn):l 對(duì)于正數(shù),原碼、反碼、補(bǔ)碼相同l 對(duì)于負(fù)數(shù),其補(bǔ)碼為它的反碼加1l 補(bǔ)碼符號(hào)位不動(dòng),其他位求反,最后整個(gè)數(shù)加1,得到原碼十進(jìn)制數(shù)補(bǔ)碼+150000 1111-151111 0001+00000 0000-00000 0000#include int main()int a = -15;printf(%xn, a);/結(jié)果為 fffffff1/fffffff1對(duì)應(yīng)的二進(jìn)制:1111 1111 1111 1111 1111 1111 1111 0001/符號(hào)位不變,其它取反:1000 0000 0000 0000 0000 0000 0000 1110/上面加1:1000 0000 0000 0000 0000 0000 0000 1111 最高位1代表負(fù)數(shù),就是-15return 0;2.3.4 補(bǔ)碼的意義示例1:用8位二進(jìn)制數(shù)分別表示+0和-0十進(jìn)制數(shù)原碼+00000 0000-01000 0000十進(jìn)制數(shù)反碼+00000 0000-01111 1111不管以原碼方式存儲(chǔ),還是以反碼方式存儲(chǔ),0也有兩種表示形式。為什么同樣一個(gè)0有兩種不同的表示方法呢?但是如果以補(bǔ)碼方式存儲(chǔ),補(bǔ)碼統(tǒng)一了零的編碼:十進(jìn)制數(shù)補(bǔ)碼+0 0000 0000-010000 0000由于只用8位描述,最高位1丟棄,變?yōu)?000 0000示例2:計(jì)算9-6的結(jié)果以原碼方式相加:十進(jìn)制數(shù)原碼90000 1001-61000 0110結(jié)果為-15,不正確。以補(bǔ)碼方式相加:十進(jìn)制數(shù)補(bǔ)碼90000 1001-61111 1010最高位的1溢出,剩余8位二進(jìn)制表示的是3,正確。在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來(lái)存儲(chǔ),主要原因是:l 統(tǒng)一了零的編碼l 將符號(hào)位和其它位統(tǒng)一處理l 將減法運(yùn)算轉(zhuǎn)變?yōu)榧臃ㄟ\(yùn)算l 兩個(gè)用補(bǔ)碼表示的數(shù)相加時(shí),如果最高位(符號(hào)位)有進(jìn)位,則進(jìn)位被舍棄2.4 sizeof關(guān)鍵字l sizeof不是函數(shù),所以不需要包含任何頭文件,它的功能是計(jì)算一個(gè)數(shù)據(jù)類(lèi)型的大小,單位為字節(jié)l sizeof的返回值為size_tl size_t類(lèi)型在32位操作系統(tǒng)下是unsigned int,是一個(gè)無(wú)符號(hào)的整數(shù)#include int main()int a;int b = sizeof(a);/sizeof得到指定值占用內(nèi)存的大小,單位:字節(jié)printf(b = %dn, b);size_t c = sizeof(a);printf(c = %un, c);/用無(wú)符號(hào)數(shù)的方式輸出c的值return 0;2.5整型:int2.5.1 整型變量的定義和輸出打印格式含義%d輸出一個(gè)有符號(hào)的10進(jìn)制int類(lèi)型%o(字母o)輸出8進(jìn)制的int類(lèi)型%x輸出16進(jìn)制的int類(lèi)型,字母以小寫(xiě)輸出%X輸出16進(jìn)制的int類(lèi)型,字母以大寫(xiě)寫(xiě)輸出%u輸出一個(gè)10進(jìn)制的無(wú)符號(hào)數(shù)#include int main()int a = 123;/定義變量a,以10進(jìn)制方式賦值為123int b = 0567;/定義變量b,以8進(jìn)制方式賦值為0567int c = 0xabc;/定義變量c,以16進(jìn)制方式賦值為0xabcprintf(a = %dn, a);printf(8進(jìn)制:b = %on, b);printf(10進(jìn)制:b = %dn, b);printf(16進(jìn)制:c = %xn, c);printf(16進(jìn)制:c = %Xn, c);printf(10進(jìn)制:c = %dn, c);unsigned int d = 0xffffffff; /定義無(wú)符號(hào)int變量d,以16進(jìn)制方式賦值printf(有符號(hào)方式打?。篸 = %dn, d);printf(無(wú)符號(hào)方式打印:d = %un, d);return 0;2.5.2 整型變量的輸入#include int main()int a;printf(請(qǐng)輸入a的值:);/不要加“n”scanf(%d, &a);printf(a = %dn, a); /打印a的值return 0;2.5.3 short、int、long、long long數(shù)據(jù)類(lèi)型占用空間short(短整型)2字節(jié)int(整型)4字節(jié)long(長(zhǎng)整形)Windows為4字節(jié),Linux為4字節(jié)(32位),8字節(jié)(64位)long long(長(zhǎng)長(zhǎng)整形)8字節(jié)注意:l 需要注意的是,整型數(shù)據(jù)在內(nèi)存中占的字節(jié)數(shù)與所選擇的操作系統(tǒng)有關(guān)。雖然 C 語(yǔ)言標(biāo)準(zhǔn)中沒(méi)有明確規(guī)定整型數(shù)據(jù)的長(zhǎng)度,但 long 類(lèi)型整數(shù)的長(zhǎng)度不能短于 int 類(lèi)型, short 類(lèi)型整數(shù)的長(zhǎng)度不能短于 int 類(lèi)型。l 當(dāng)一個(gè)小的數(shù)據(jù)類(lèi)型賦值給一個(gè)大的數(shù)據(jù)類(lèi)型,不會(huì)出錯(cuò),因?yàn)榫幾g器會(huì)自動(dòng)轉(zhuǎn)化。但當(dāng)一個(gè)大的類(lèi)型賦值給一個(gè)小的數(shù)據(jù)類(lèi)型,那么就可能丟失高位。整型常量所需類(lèi)型10代表int類(lèi)型10l, 10L代表long類(lèi)型10ll, 10LL代表long long類(lèi)型10u, 10U代表unsigned int類(lèi)型10ul, 10UL代表unsigned long類(lèi)型10ull, 10ULL代表unsigned long long類(lèi)型打印格式含義%hd輸出short類(lèi)型%d輸出int類(lèi)型%l輸出long類(lèi)型%ll輸出long long類(lèi)型%hu輸出unsigned short類(lèi)型%u輸出unsigned int類(lèi)型%lu輸出unsigned long類(lèi)型%llu輸出unsigned long long類(lèi)型#include int main()short a = 10;int b = 10;long c = 10l; /或者10Llong long d = 10ll; /或者10LLprintf(sizeof(a) = %un, sizeof(a);printf(sizeof(b) = %un, sizeof(b);printf(sizeof(c) = %un, sizeof(c);printf(sizeof(c) = %un, sizeof(d);printf(short a = %hdn, a);printf(int b = %dn, b);printf(long c = %ldn, c);printf(long long d = %lldn, d);unsigned short a2 = 20u;unsigned int b2 = 20u;unsigned long c2= 20ul; unsigned long long d2 = 20ull; printf(unsigned short a = %hun, a2);printf(unsigned int b = %un, b2);printf(unsigned long c = %lun, c2);printf(unsigned long long d = %llun, d2);return 0;2.5.4 有符號(hào)數(shù)和無(wú)符號(hào)數(shù)區(qū)別1) 有符號(hào)數(shù)有符號(hào)數(shù)是最高位為符號(hào)位,0代表正數(shù),1代表負(fù)數(shù)。#include int main()signed int a = -1089474374; /定義有符號(hào)整型變量aprintf(%Xn, a); /結(jié)果為 BF0FF0BA/B F 0 F F 0 B A/1011 1111 0000 1111 1111 0000 1011 1010return 0;2) 無(wú)符號(hào)數(shù)無(wú)符號(hào)數(shù)最高位不是符號(hào)位,而就是數(shù)的一部分,無(wú)符號(hào)數(shù)不可能是負(fù)數(shù)。#include int main()unsigned int a = 3236958022; /定義無(wú)符號(hào)整型變量aprintf(%Xn, a); /結(jié)果為 C0F00F46return 0;當(dāng)我們寫(xiě)程序要處理一個(gè)不可能出現(xiàn)負(fù)值的時(shí)候,一般用無(wú)符號(hào)數(shù),這樣可以增大數(shù)的表達(dá)最大值。3) 有符號(hào)和無(wú)符號(hào)整型取值范圍數(shù)據(jù)類(lèi)型占用空間取值范圍short2字節(jié)-32768 到 32767 (-215 215-1)int4字節(jié)-2147483648 到 2147483647 (-231 231-1)long4字節(jié)-2147483648 到 2147483647 (-231 231-1)unsigned short2字節(jié)0 到 65535 (0 216-1)unsigned int4字節(jié)0 到 4294967295 (0 232-1)unsigned long4字節(jié)0 到 4294967295 (0 232-1)2.6字符型:char2.6.1 字符變量的定義和輸出字符型變量用于存儲(chǔ)一個(gè)單一字符,在 C 語(yǔ)言中用 char 表示,其中每個(gè)字符變量都會(huì)占用 1 個(gè)字節(jié)。在給字符型變量賦值時(shí),需要用一對(duì)英文半角格式的單引號(hào)( )把字符括起來(lái)。字符變量實(shí)際上并不是把該字符本身放到變量的內(nèi)存單元中去,而是將該字符對(duì)應(yīng)的 ASCII 編碼放到變量的存儲(chǔ)單元中。char的本質(zhì)就是一個(gè)1字節(jié)大小的整型。#include int main()char ch = a;printf(sizeof(ch) = %un, sizeof(ch);printf(ch%c = %cn, ch); /打印字符printf(ch%d = %dn, ch); /打印a ASCII的值char A = A;char a = a;printf(a = %dn, a);/97printf(A = %dn, A);/65printf

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論