版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、C/C+技術(shù)文檔目錄C/C+技術(shù)文檔1c語(yǔ)言4C程序運(yùn)行所需要的過(guò)程4文本編寫代碼4預(yù)處理(這個(gè)可以沒(méi)有,這是跨平臺(tái)程序所需要的)4complie5link(build)5execute6書上看到實(shí)現(xiàn)一個(gè)程序的過(guò)程(統(tǒng)稱為翻譯)7編譯7鏈接8執(zhí)行8基本語(yǔ)法9三字符序列9轉(zhuǎn)義字符(不解釋)10#include10#include<stdio.h>頭文件10int main()主函數(shù)11printf()打印輸出語(yǔ)句11scanf格式化輸入函數(shù)11注釋11注意:C程序一定是從主函數(shù)開(kāi)始執(zhí)行的。12變量12#define宏定義12類型重命名(typedef)14基本數(shù)據(jù)類型14格式化輸出語(yǔ)
2、句16常量(即字面值常量literal constant)17類型轉(zhuǎn)換20運(yùn)算符22循環(huán)體27break語(yǔ)句37continue(只能在循環(huán)體里面)39goto(執(zhí)行g(shù)oto語(yǔ)句后,程序?qū)⑻D(zhuǎn)到該標(biāo)號(hào)處并執(zhí)行其后的語(yǔ)句。)39switch41操作符(運(yùn)算符)和表達(dá)式42自創(chuàng)函數(shù)(方法函數(shù))45遞歸函數(shù)(自己調(diào)用自己)48局部與全局53存儲(chǔ)類別55內(nèi)部外部函數(shù)57static關(guān)鍵字(注意)58數(shù)組58多維數(shù)組61字符串(C語(yǔ)言中沒(méi)有字符串,只有字符數(shù)組)62c語(yǔ)言指針66概述66指針66指針變量66操作指針形參不會(huì)影響實(shí)參67通過(guò)指針引用數(shù)組68使用指針需要注意的問(wèn)題73通過(guò)指針引用多維數(shù)組74
3、異常處理74C_Cast.obj : error LNK2005: _main already defined in testc2.objDebug/test2.exe : fatal error LNK1169: one or more multiply defined symbols foundError executing link.exe.74C陷阱74運(yùn)算符執(zhí)行順序74函數(shù)庫(kù)75stdio.h75常量75函數(shù)75string.h76常量76函數(shù)76C+語(yǔ)言79c語(yǔ)言C程序運(yùn)行所需要的過(guò)程文本編寫代碼 編寫文本代碼,生成c或cpp文件,這時(shí)候它還是文本的; 預(yù)處理(
4、這個(gè)可以沒(méi)有,這是跨平臺(tái)程序所需要的)有時(shí)候,我們需要將程序在windows和Linux下都能夠運(yùn)行,只要用VS編譯工具下編譯一遍,在GCC編譯工具下編譯一遍。但是如果,有一種情況就一個(gè)程序有兩個(gè)函數(shù)a()和b(),a()在Window下可以編譯運(yùn)行,但是b()不能運(yùn)行的,b()在Linux下可以編譯運(yùn)行,a()不能運(yùn)行,這就需要在編譯之前對(duì)代碼進(jìn)行預(yù)處理。預(yù)處理的形式如下:#include <stdio.h>#include "myHeader.h"系統(tǒng)將自動(dòng)調(diào)用預(yù)處理程序?qū)υ闯绦蛑械念A(yù)處理部分作處理,處理完畢自動(dòng)進(jìn)入對(duì)源程序的編譯。宏定義文件包含條件編譯 c
5、omplie編譯,就是compile,由c編譯程序?qū)δ銓懙拇a進(jìn)行詞法和句法分析,發(fā)現(xiàn)并報(bào)告錯(cuò)誤,有錯(cuò)時(shí)編譯不能通過(guò)。如若無(wú)錯(cuò),則生成中間代碼,擴(kuò)展名為obj,此時(shí)它便是二進(jìn)制的了; link(build)連接,在匯編里稱link,在c里叫生成,即build,它的作用是生成可執(zhí)行的exe文件。由于一個(gè)程序的源碼可由多個(gè)文件組成。這些文件在第二步 中分別編譯,生成各自的目標(biāo)文件,這一步的作用便是將這些obj文件,以及程序中需要的其它庫(kù)文件(dll除開(kāi)),統(tǒng)一到一個(gè)文件中來(lái),形成單個(gè)的exe 文件。此exe文件便可以在操作系統(tǒng)下直接運(yùn)行了。 link將會(huì)把編譯好的多個(gè)目標(biāo)文件以
6、及系統(tǒng)中的庫(kù)和組件等,組合成一個(gè)可執(zhí)行的程序上述第二步做完中間代碼生成的工作后還有個(gè)代碼優(yōu)化,這里就不詳講了。 executecompile、build分別對(duì)應(yīng)編譯和連接這兩個(gè)過(guò)程。execute的意思是執(zhí)行,即生成了exe文件后運(yùn)行它。如果你的程序有修改,點(diǎn)這一項(xiàng)它會(huì) 彈出窗口問(wèn)你是否重新編譯和連接,也就是它可以自動(dòng)把前面的工作都做了。也就是說(shuō),vc菜單里的execute功能如下: 1.程序有修改時(shí),或者沒(méi)有做前面的編譯連接工作時(shí) executecompilebuild執(zhí)行; 2.程序編譯連接好后 execute僅僅是執(zhí)行,不再做前面兩項(xiàng)工作
7、。 當(dāng)程序有修改時(shí),選擇execute只重編譯和連接有改動(dòng)的內(nèi)容,但這樣做有時(shí)候會(huì)出錯(cuò),這時(shí)可選擇build菜單下的rebuild all,重新編譯、連接所有文件。 總之,c程序的生成可圖示如下: 編寫源代碼->編譯->連接,也叫生成->運(yùn)行 對(duì)應(yīng)的各個(gè)階段處理的文件的擴(kuò)展名為: c或cpp->obj->exe。 c程序是編譯執(zhí)行的,還有一種程序是解釋執(zhí)行的,如java,它的源文件經(jīng)過(guò)編譯后形成擴(kuò)展名為class的中間代碼,之后不做連接生成exe文件,而是直接將這種.class的中間代碼拿到j(luò)ava虛擬機(jī)
8、平臺(tái)上,由解釋器解釋執(zhí)行。這種方式效率較低,但較靈活。書上看到實(shí)現(xiàn)一個(gè)程序的過(guò)程(統(tǒng)稱為翻譯)Source codeSource codeSource codeComplierComplierComplierLibrariesObject codeObject codeObject codeExecutableLinker編譯整個(gè)編譯過(guò)程: 將一個(gè)源文件(也有可能是多個(gè)源文件,可能有依賴其他頭文件,或者library),編譯成目標(biāo)代碼(object code),所謂的目標(biāo)代碼其實(shí)就是二進(jìn)制文件預(yù)處理器處理(preprocessor)在這個(gè)過(guò)程,預(yù)處理器,在源代碼上進(jìn)行文本操作,例如將”#def
9、ine”指令定義的符號(hào),轉(zhuǎn)換為指定數(shù)值解析(parse)預(yù)處理完成后,進(jìn)入解析階段,此階段會(huì)將檢測(cè)語(yǔ)法問(wèn)題,并打印警告和錯(cuò)誤。鏈接將多個(gè)源文件鏈接到一起,形成單一或者完整可行程序。執(zhí)行載入內(nèi)存開(kāi)始初始化變量,那些不是存儲(chǔ)在堆棧中的,未被初始化的變量將會(huì)這個(gè)時(shí)候賦初始值。程序開(kāi)始執(zhí)行1、 這個(gè)開(kāi)始時(shí)會(huì)接收命令行參數(shù),然后開(kāi)始執(zhí)行main函數(shù)2、 程序會(huì)使用堆棧(stack)和靜態(tài)內(nèi)存(static),堆棧存儲(chǔ)的是局部變量和返回地址,靜態(tài)內(nèi)存存儲(chǔ)的變量,在整個(gè)程序執(zhí)行結(jié)束后內(nèi)存數(shù)據(jù)才會(huì)銷毀程序的中止1、 正常的中止2、 用戶break鍵3、 發(fā)生錯(cuò)誤停止 基本語(yǔ)法三字符序列?(?)?!|?<
10、?>?=#?/?-三字符序列即可以將對(duì)應(yīng)“?”加一個(gè)字符,轉(zhuǎn)換成其他表達(dá)式,以前是為了表示鍵盤中沒(méi)有字符,或者是為了防止有些字符集不包含對(duì)應(yīng)的字符一般這個(gè)很少用,因?yàn)橛袠O大 的出錯(cuò)可能比如:printf(“delete file ( are you really sure?)”);這個(gè)輸出過(guò)程可能會(huì)出現(xiàn)”“int main(void)printf("?) n");return 0;轉(zhuǎn)義字符(不解釋)/ANSI C標(biāo)準(zhǔn)中新增的轉(zhuǎn)義字符printf("ddd n");/輸出ddd,表示13個(gè)八進(jìn)制數(shù)字printf("xddd n")
11、;/表示13個(gè)都十六進(jìn)制數(shù)字,因?yàn)檩敵鲎址L(zhǎng),報(bào)錯(cuò)無(wú)法輸出#include#include是文件包含命令,主要用來(lái)引入對(duì)應(yīng)的頭文件。#include的處理過(guò)程很簡(jiǎn)單,就是將頭文件的內(nèi)容插入到該命令所在的位置,從而把頭文件和當(dāng)前源文件連接成一個(gè)源文件,這與復(fù)制粘貼的效果相同。例:#include <stdio.h>#include "myHeader.h"“”和<>的區(qū)別,這只是搜索路徑不一樣,包含標(biāo)準(zhǔn)庫(kù)的頭文件建議采用<>,自定義頭文件的建議采用”。說(shuō)明:· 一個(gè)#include命令只能包含一個(gè)頭文件,多個(gè)頭文件需要多個(gè)#in
12、clude命令。· 文件包含允許嵌套,也就是說(shuō)在一個(gè)被包含的文件中又可以包含另一個(gè)文件。#include<stdio.h>頭文件#include <stdio.h>就是一條預(yù)處理命令,它的作用是通知C語(yǔ)言編譯系統(tǒng)在對(duì)C程序進(jìn)行正式編譯之前需做一些預(yù)處理工作int main()主函數(shù)是主運(yùn)行函數(shù),注:在最新的C標(biāo)準(zhǔn)中,main函數(shù)返回類型為int而不是void個(gè)人解析按照J(rèn)AVA的思想解析的話,就是stdio.h這個(gè)頭文件中封裝int main()函數(shù),其他想要調(diào)用的必須#include<stdio.h>printf()打印輸出語(yǔ)句scanf格式化輸
13、入函數(shù)scanf(“%d”,&n);/掃描用戶輸入的整型數(shù)據(jù),將它輸出,(&n是取變量n的地址)并且將其值賦值給變量n注釋多行注釋: /* 注釋內(nèi)容 */ 單行注釋: /注釋一行注意:C程序一定是從主函數(shù)開(kāi)始執(zhí)行的。變量標(biāo)識(shí)符(即為變量名)(1)標(biāo)識(shí)符的長(zhǎng)度最好不要超過(guò)8位,因?yàn)樵谀承┌姹镜腃中規(guī)定標(biāo)識(shí)符前8位有效,當(dāng)兩個(gè)標(biāo)識(shí)符前8位相同時(shí),則被認(rèn)為是同一個(gè)標(biāo)識(shí)符。 (2)標(biāo)識(shí)符是嚴(yán)格區(qū)分大小寫的。例如Imooc和imooc 是兩個(gè)不同的標(biāo)識(shí)符。 (3)標(biāo)識(shí)符最好選擇有意義的英文單詞組成做到"見(jiàn)名知意",
14、不要使用中文。(4)標(biāo)識(shí)符不能是C語(yǔ)言的關(guān)鍵字。想了解更多C語(yǔ)言關(guān)鍵字的知識(shí),請(qǐng)查閱WIKI。變量名、變量值、存儲(chǔ)單元#define宏定義宏定義的形式#define 宏名 字符串#表示這是一條預(yù)處理命令,所有的預(yù)處理命令都以#開(kāi)頭。define是預(yù)處理命令。宏名是標(biāo)識(shí)符的一種,命名規(guī)則和標(biāo)識(shí)符相同。字符串可以是常數(shù)、表達(dá)式等。例:1. #include <stdio.h>2.3. #define N 1004.5. int main()6. int sum = 20 + N;7. printf("%dn", sum);8. return
15、0;9. 注意:這里的字符串只是一段序列,與C或者JAVA語(yǔ)言的中字符串不一樣;程序中可反復(fù)使用的表達(dá)式宏定義 ,可以定義一個(gè)復(fù)雜的表達(dá)式的,調(diào)用時(shí)使用標(biāo)識(shí)符(如:M),程序真正運(yùn)行的時(shí)候,會(huì)用表達(dá)式代替標(biāo)識(shí)符運(yùn)行。例:1. #include <stdio.h>2.3. #define M (n*n+3*n)4.5. int main()6. int sum, n;7. printf("Input a number: ");8. scanf("%d", &n);9. sum = 3*M+4*M+5*M;10. printf("
16、;sum=%dn", n);11. return 0;12. 類型重命名(typedef)例:typedef char *newType;char mychar='a'newType a=&mychar;printf(a);/輸出字符a這個(gè)關(guān)鍵字其實(shí)是將newType,定義為指針字符的指針基本數(shù)據(jù)類型基本數(shù)據(jù)類型(char,int,float,double)整型(char,int,short int,long int,unsigned int, unsigned short int,unsigned long int)注:int、short int、long
17、int是根據(jù)編譯環(huán)境的不同,所取范圍不同。而其中short int和long int至少是表中所寫范圍,但是int在表中是以16位編譯環(huán)境寫的取值范圍。另外 c語(yǔ)言int的取值范圍在于他占用的字節(jié)數(shù) ,不同的編譯器,規(guī)定是不一樣。ANSI標(biāo)準(zhǔn)定義int是占2個(gè)字節(jié),TC是按ANSI標(biāo)準(zhǔn)的,它的int是占2個(gè)字節(jié)的。但是在VC里,一個(gè)int是占4個(gè)字節(jié)的。char:盡管設(shè)計(jì)char類型變量的目的是為了內(nèi)容字符型值,但字符的本質(zhì)是小整型值char其實(shí)可分兩種:signed char和unsigned char類型,一般來(lái)說(shuō)如果在程序中只申明char類型的變量,程序的兼容性就好一點(diǎn),而且要
18、保存賦給char類型變量的值在signed char 和unsigned char交集,保存這兩個(gè)條件,程序的可移植性就比較高 TC、VC是兩種編譯器浮點(diǎn)型浮點(diǎn)數(shù)據(jù)是指帶小數(shù)的數(shù)字。大類型轉(zhuǎn)小類型double to floatdouble a=3.1415926;float b;b=a;printf("%f",b);/3.141593,居然四舍五入了long to shortlong a=2147483647;short b;b=a;printf("%d",b);/輸出-1,強(qiáng)轉(zhuǎn)失效例格式化輸出語(yǔ)句格式化輸出語(yǔ)句,也可以說(shuō)是占位輸出,是將各種類型的數(shù)據(jù)按
19、照格式化后的類型及指定的位置從計(jì)算機(jī)上顯示。這樣做的好處,是有利于計(jì)算機(jī)能夠準(zhǔn)確的將我們所要類型數(shù)據(jù)給我們。格式其格式為:printf("輸出格式符",輸出項(xiàng));常用格式化符例輸出結(jié)果為: a=10 如果要輸出多個(gè)變量的并指定變量的位置時(shí)候,格式符還可以連用,變量之間需要用逗號(hào)隔開(kāi),如:輸出結(jié)果為: 整數(shù):10,小數(shù):7.560000,字符:c 注意:格式符的個(gè)數(shù)要與變量、常量或者表達(dá)式的個(gè)數(shù)一一對(duì)應(yīng) 常量(即字面值常量literal constant)直接常量(字面量,是可以
20、直接拿來(lái)使用,無(wú)需說(shuō)明的量)例· 整型常量:13、0、-13;· 實(shí)型常量:13.33、-24.4;· 字符常量:a、M· 字符串常量:” love you”打開(kāi)幾種直接常量:符號(hào)常量在C語(yǔ)言中,可以用一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)常量,稱之為符號(hào)常量。符號(hào)常量在使用之前必須先定義,其一般形式為:#define 標(biāo)識(shí)符 常量值 #define 標(biāo)識(shí)符 常量值 常量的標(biāo)識(shí)符一般采用大寫(用來(lái)區(qū)別常量與變量)例#include <stdio.h>#define POCKETMONEY 10 /定義常量及常量值int main() /PO
21、CKETMONEY = 12; /小明私自增加零花錢對(duì)嗎? printf("小明今天又得到%d元零花錢n", POCKETMONEY); return 0; 常量(const關(guān)鍵字)(即讓變量不可以改變)變量值不可以改變const int aint const a(變量a的值不可以改變)針對(duì)指針變量const int *a(a的指針?lè)较蚩梢愿淖?,但是指向的值不可以改?int const*a(a的指針?lè)较虿豢梢愿淖儯侵赶虻闹凳强梢愿淖兊?int const *const a;(指針和指向值都不可以改變)常量申明時(shí)必須初始化int const a=25;int const
22、 b;/error C2734: 'b' : const object must be initialized if not extern,常量必須初始化b=25;printf("%dn"a);printf("%dn",b);多字節(jié)字符常量即單引號(hào)內(nèi)有多個(gè)字符,例如:abc當(dāng)然這種多字節(jié)字符中常量,在不同的運(yùn)行環(huán)境下可能有不同結(jié)果,所以不鼓勵(lì)這樣寫寬字符常量(wide character literal)寬字符常量只需要在字符前面加一個(gè)L,例如:Lx當(dāng)然,這種寬字符常量,需要運(yùn)行環(huán)境支持寬字符集枚舉類型(enumerated)例:enum
23、 Jar_TypeCUP,PINT,QUART,HALF_GALLON,GALLON或者enum Jar_TypeCUP=8,PINT=16,QUART=32,HALF_GALLON=64,GALLON=128字符串常量當(dāng)一個(gè)表達(dá)式中出現(xiàn)字符串常量時(shí),表達(dá)式所使用的值就是指向字符串的指針注意,字符串常量不能直接賦值給字符數(shù)組,因?yàn)樽址旧砭褪侵羔橆愋娃D(zhuǎn)換自動(dòng)類型轉(zhuǎn)換自動(dòng)轉(zhuǎn)換規(guī)則自動(dòng)轉(zhuǎn)換發(fā)生在不同數(shù)據(jù)類型運(yùn)算時(shí),在編譯的時(shí)候自動(dòng)完成。自動(dòng)轉(zhuǎn)換遵循的規(guī)則就好比小盒子可以放進(jìn)大盒子里面一樣,下圖表示了類型自動(dòng)轉(zhuǎn)換的規(guī)則。強(qiáng)制類型轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換是通過(guò)定義類型轉(zhuǎn)換運(yùn)算來(lái)實(shí)現(xiàn)的。其一般形式為:
24、0;(數(shù)據(jù)類型) (表達(dá)式) 其作用是把表達(dá)式的運(yùn)算結(jié)果強(qiáng)制轉(zhuǎn)換成類型說(shuō)明符所表示的類型,例如:輸入結(jié)果:注意:1、數(shù)據(jù)類型和表達(dá)式都必須加括號(hào),如把(int)(x/2+y)寫成(int)x/2+y則成了把x轉(zhuǎn)換成int型之后再除2再與y相加了。2、轉(zhuǎn)換后不會(huì)改變?cè)瓟?shù)據(jù)的類型及變量值,只在本次運(yùn)算中臨時(shí)性轉(zhuǎn)換。3、強(qiáng)制轉(zhuǎn)換后的運(yùn)算結(jié)果不遵循四舍五入原則。例/*強(qiáng)制類型的轉(zhuǎn)換:大類型轉(zhuǎn)換小類型*/double num=2.5;printf("num的整型部分是%dn",(int)num);/輸出2return 0;運(yùn)算符 算術(shù)運(yùn)算符/*算術(shù)運(yùn)算符*/int x,y;
25、x=-10;y=3;printf("x+y=%dn",x+y);/輸出7printf("x-y=%dn",x-y);/輸出13printf("x*y=%dn",x*y);/輸出-30printf("x/y=%dn",x/y);/輸出-3,int類型取整,不取余printf("x%y=%dn",x%y);/輸出1,正負(fù),要看被取余數(shù)是正是負(fù)/*自增自減運(yùn)算符*/ int x = 0; printf("x=%dn",x+);/輸出0,因?yàn)橄冗\(yùn)算后自增 printf("注
26、意這里并不改變x的值%dn",x+1);/輸出2 printf("x=%dn",+x);/輸出2,先自增后運(yùn)算 賦值運(yùn)算符簡(jiǎn)單賦值運(yùn)算符(=)復(fù)合賦值運(yùn)算符(+=、-=、*=、/=、%=等)復(fù)合賦值運(yùn)算符就是在簡(jiǎn)單賦值符“=”之前加上其它運(yùn)算符構(gòu)成,例如+=、-=、*=、/=、%=例/*賦值運(yùn)算符*/int x = 10; int y = 10; /使用簡(jiǎn)單賦值語(yǔ)句實(shí)現(xiàn)x乘以2。 x=x*2; /使用復(fù)合賦值語(yǔ)句實(shí)現(xiàn)y乘以2。 y*=2; printf("x=%dn", x);/輸出20 printf("y=%dn", y)
27、;/輸出20 return 0; 關(guān)系運(yùn)算符/*關(guān)系運(yùn)算符*/int x=5; int y=5; int z=10; printf("x是否大于y:%dn", x>y ); /x是否大于y, 輸出0 printf("y是否大于等于x:%dn", y>=x ); /y是否大于等于x 輸出1 printf("y是否小于z:%dn", y<z ); /y是否小于z輸出1 printf("z是否小于等于x:%dn",z<=x); /z是否小于等于x輸出0 printf("z是否等于x+y:
28、%dn", z=(x+y); /z是否等于x+y輸出1 return 0; 邏輯運(yùn)算符邏輯運(yùn)算的值也是有兩種分別為“真”和“假”,C語(yǔ)言中用整型的1和0來(lái)表示。1) 與運(yùn)算(&&)參與運(yùn)算的兩個(gè)變量都為真時(shí),結(jié)果才為真,否則為假。例如:5>=5 && 7>5 ,運(yùn)算結(jié)果為真;2) 或運(yùn)算(|)參與運(yùn)算的兩個(gè)變量只要有一個(gè)為真,結(jié)果就為真。 兩個(gè)量都為假時(shí),結(jié)果為假。例如:5>=5|5>8,運(yùn)算結(jié)果為真;3) 非運(yùn)算(!)參與運(yùn)算的變量為真時(shí),結(jié)果為假;參與運(yùn)算量為假時(shí),結(jié)果為真。例如:!(5>8),運(yùn)算結(jié)果為真。某靚女要招
29、募男盆友了,給出的條件是身高不能低于180CM且銀行存款不少于100萬(wàn);/*邏輯運(yùn)算符*/int height = 175; /身高為175cm double money = 1500000; /銀行存款為150萬(wàn) printf("是否符合條件:%dn",height>=180&&money>=1000000) ; return 0; 三目運(yùn)算符( 表達(dá)式1 ? 表達(dá)式2 : 表達(dá)式3; ) 表達(dá)式1 ? 表達(dá)式2 : 表達(dá)式3; 執(zhí)行過(guò)程是:先判斷表達(dá)式1的值是否為真,如果是真的話執(zhí)行表達(dá)式2;如果是假的
30、話執(zhí)行表達(dá)式3。例/*三目運(yùn)算符*/定義小編兜里的錢 double money = 12; /定義打車回家的費(fèi)用 double cost = 11.5; printf("小編能不能打車回家呢:"); /輸出y小編就打車回家了,輸出n小編就不能打車回家 printf("小編能不能打車回家呢:%cn",money>=cost?'y':'n'); return 0;運(yùn)算符的優(yōu)先級(jí)循環(huán)體while詳解注意:1、while語(yǔ)句中的表達(dá)式一般是關(guān)系表達(dá)或邏輯表達(dá)式,當(dāng)表達(dá)式的值為假時(shí)不執(zhí)行循環(huán)體,反之則循環(huán)體一直執(zhí)行。2、一定要
31、記著在循環(huán)體中改變循環(huán)變量的值,否則會(huì)出現(xiàn)死循環(huán)(無(wú)休止的執(zhí)行)。3、循環(huán)體如果包括有一個(gè)以上的語(yǔ)句,則必須用括起來(lái),組成復(fù)合語(yǔ)句。例/*while循環(huán)體*/int i=1;int sum=0;while(i<=100)sum+=i;i+;printf("100以內(nèi)所有數(shù)的和為%dn",sum);do while詳解例某公司2014年在職人數(shù)為200人,以每年20%增長(zhǎng)速度不斷擴(kuò)大招工規(guī)模,請(qǐng)使用do-while循環(huán)計(jì)算從2014開(kāi)始至哪一年招工規(guī)模能夠突破1000人。/*do while循環(huán)體*/int number=200; int year=2014; do y
32、ear+; number*=1.2; /這里是不是應(yīng)該寫點(diǎn)什么? while(number<1000&&year<2023); /這里好像缺點(diǎn)什么 printf("到%d年招工規(guī)模突破1000人n", year);for循環(huán)詳解循環(huán)過(guò)程 第一步:執(zhí)行表達(dá)式1,對(duì)循環(huán)變量做初始化;第二步:判斷表達(dá)式2,若其值為真(非0),則執(zhí)行for循環(huán)體中執(zhí)行代碼塊,然后向下執(zhí)行;若其值為假(0),則結(jié)束循環(huán);第三步:執(zhí)行表達(dá)式3;第四步:執(zhí)行for循環(huán)中執(zhí)行代碼塊后執(zhí)行第二步;第五步:循環(huán)結(jié)束,程序繼續(xù)向下執(zhí)行。例/ 定義變量sum, num int sum,
33、 num; sum = 0; for(num = 0;num<=10 ;num+ )/for循環(huán)條件與num的變化值 sum+=num; /計(jì)算每次數(shù)字之間的和sum printf("10以內(nèi)數(shù)的和為:%d", sum); return 0;注意:i必須在外面申明,這是不是java的語(yǔ)法 int i; for(i=0;i<length;i+) printf("%d",arri); for循環(huán)詳解2在for循環(huán)中,表達(dá)式1是一個(gè)或多個(gè)賦值語(yǔ)句,它用來(lái)控制變量的初始值;表達(dá)式2是一個(gè)關(guān)系表達(dá)式,它決定什么時(shí)候退出循環(huán);表達(dá)式3是循環(huán)變量的步進(jìn)值,
34、定義控制循環(huán)變量每循環(huán)一次后按什么方式變化。這三部分之間用分號(hào)(;)分開(kāi)。使用for語(yǔ)句應(yīng)該注意:1、for循環(huán)中的“表達(dá)式1、2、3”均可可以缺省,但分號(hào)(;)不能缺省。2、省略“表達(dá)式1(循環(huán)變量賦初值)”,表示不對(duì)循環(huán)變量賦初始值。如:3、省略“表達(dá)式2(循環(huán)條件)”,不做其它處理,循環(huán)一直執(zhí)行(死循環(huán))。如:4、省略“表達(dá)式3(循環(huán)變量增量)”,不做其他處理,循環(huán)一直執(zhí)行(死循環(huán))。如:注:死循環(huán)可以使用后面即將講到的break解決5、表達(dá)式1可以是設(shè)置循環(huán)變量的初值的賦值表達(dá)式,也可以是其他表達(dá)式。如:6、表達(dá)式1和表達(dá)式3可以是一個(gè)簡(jiǎn)單表達(dá)式也可以是多個(gè)表達(dá)式以逗號(hào)分割。如:運(yùn)行結(jié)
35、果為7、表達(dá)式2一般是關(guān)系表達(dá)式或邏輯表達(dá)式,但也可是數(shù)值表達(dá)式或字符表達(dá)式,只要其值非零,就執(zhí)行循環(huán)體。8、各表達(dá)式中的變量一定要在for循環(huán)之前定義。如:例:(輸出0-1000以內(nèi)的水仙花數(shù))/*水仙花數(shù)*/輸出0-1000以內(nèi)的水仙花數(shù)/定義三位數(shù)num,個(gè)位數(shù)sd,十位數(shù)td,百位數(shù)hd int num, sd, td, hd; /循環(huán)所有三位數(shù) for( num=0 ; num<1000; num+) /獲取三位數(shù)字num百位上的數(shù)字 hd =num/100; /獲取三位數(shù)字num十位上的數(shù)字 td =num%100/10; /獲取三位數(shù)字num個(gè)位上的數(shù)字 sd =num%1
36、00%10; /水仙花數(shù)的條件是什么? if(num=hd*hd*hd+td*td*td+sd*sd*sd&&num>=100) printf("水仙花數(shù)字:%dn", num); return 0; 循環(huán)體的比較1、在知道循環(huán)次數(shù)的情況下更適合使用for循環(huán);2、在不知道循環(huán)次數(shù)的情況下適合使用while或者do-while循環(huán),如果有可能一次都不循環(huán)應(yīng)考慮使用while循環(huán),如果至少循環(huán)一次應(yīng)考慮使用do-while循環(huán)。但是從本質(zhì)上講,while,do-while和for循環(huán)之間是可以相互轉(zhuǎn)換的,如:小明被老師罰抄10次computer這個(gè)單詞,
37、分別用三種語(yǔ)法寫:例使用循環(huán)計(jì)算1-2+3-4+5-6+-100的值? /* 小伙伴們: 選擇你們認(rèn)為最合理的循環(huán)結(jié)構(gòu)完成功能吧 */ int sum = 0; /定義計(jì)算結(jié)果變量sum int i = 1; /定義循環(huán)數(shù)字變量i int flag = 1; /定義符號(hào)狀態(tài)變量flag /使用for循環(huán) for(i=1;i<=100;i+) sum+=i*flag; flag*=-1; printf("sum=%dn",sum); return 0; 多重嵌套循環(huán)(父循環(huán)一次,子循環(huán)需要全部執(zhí)行完,直到跳出循環(huán)。)打印金字塔int i, j, k; for(i=1;
38、i<5; i+) / 觀察每行的空格數(shù)量,補(bǔ)全循環(huán)條件 for( j=i ; j<5 ;j+) printf(" "); 輸出空格 /觀察每行*號(hào)的數(shù)量,補(bǔ)全循環(huán)條件 for( k=0; k<i*2-1 ; k+) printf("*"); /每行輸出的*號(hào) printf("n"); /每次循環(huán)換行 return 0;輸出9*9乘法表/*打印9*9乘法表*/ 定義相乘數(shù)字i,j以及結(jié)果result int i, j, result; /* * 打印9*9乘法表 */ for(i=9;i>=1;i-) for(j
39、=1;j<=i;j+)result=i*j; printf("%d*%d=%d ",i,j,result); printf("n"); return 0;break語(yǔ)句詳解那么循環(huán)5次的時(shí)候,需要中斷不繼續(xù)循環(huán)。在C語(yǔ)言中,可以使用break語(yǔ)句進(jìn)行該操作,代碼實(shí)現(xiàn)如下:運(yùn)行結(jié)果:使用break語(yǔ)句時(shí)注意以下幾點(diǎn):1、在沒(méi)有循環(huán)結(jié)構(gòu)的情況下,break不能用在單獨(dú)的if-else語(yǔ)句中。2、在多層循環(huán)中,一個(gè)break語(yǔ)句只跳出當(dāng)前循環(huán)。例:打印0-50的所有的素?cái)?shù)/*打印0-50的所有素?cái)?shù)*/int m, n; for(m=2; m<=50
40、; m+) for(n=2; n<m; n+) if(m%n=0) /什么條件下跳出當(dāng)前循環(huán) break; /這里應(yīng)該退出當(dāng)前循環(huán)了 if(m = n) /n循環(huán)結(jié)束后,如果m=n的話就輸出m printf("%d ", m);return 0;continue(只能在循環(huán)體里面)跳出一次,繼續(xù)循環(huán)運(yùn)行結(jié)果:goto(執(zhí)行g(shù)oto語(yǔ)句后,程序?qū)⑻D(zhuǎn)到該標(biāo)號(hào)處并執(zhí)行其后的語(yǔ)句。)goto語(yǔ)句通常不用,主要因?yàn)樗鼘⑹钩绦驅(qū)哟尾磺?,且不易讀,但在特定情況下,可以使用goto語(yǔ)句來(lái)提高程序的執(zhí)行速度,所以還是少用為妙。使用格式 goto 語(yǔ)句標(biāo)號(hào);例如:用goto語(yǔ)句和if語(yǔ)
41、句構(gòu)成循環(huán)求10以內(nèi)的數(shù)之和。例2:用goto語(yǔ)句和if語(yǔ)句構(gòu)成循環(huán)求10以內(nèi)的數(shù)之和/*使用goto,實(shí)現(xiàn)跳到某一時(shí)刻繼續(xù)運(yùn)行*/int sum = 0; int i; for(i=1; i<=10; i+) printf("%dn", i); if(i=3) /是不是少了一個(gè)判斷呢? goto BREAK; /在這里使用goto語(yǔ)句 BREAK:printf("結(jié)束for循環(huán)了."); /請(qǐng)選擇合適位置添加標(biāo)識(shí)符 return 0; switch詳解其執(zhí)行順序如下圖:在使用switch語(yǔ)句時(shí)還應(yīng)注意以下幾點(diǎn):1、在case后的各常量表達(dá)式的值不
42、能相同,否則會(huì)出現(xiàn)錯(cuò)誤。2、在case子句后如果沒(méi)有break;會(huì)一直往后執(zhí)行一直到遇到break;才會(huì)跳出switch語(yǔ)句。3、switch后面的表達(dá)式語(yǔ)句只能是整型或者字符類型。4、在case后,允許有多個(gè)語(yǔ)句,可以不用括起來(lái)。5、各case和default子句的先后順序可以變動(dòng),而不會(huì)影響程序執(zhí)行結(jié)果。6、default子句可以省略不用。操作符(運(yùn)算符)和表達(dá)式移位操作符移位有兩種計(jì)算方式(一般由編譯器決定)算術(shù)移位一般是為了,保證移位后,正負(fù)相同。左移位時(shí),算術(shù)移位和邏輯移位的結(jié)果是一樣的邏輯移位(右移位后突出的由0補(bǔ)齊,結(jié)果正負(fù)可能會(huì)與原數(shù)不相同)1001011000100101右移
43、兩位算術(shù)移位(右移位后,如果原最高為1,則空出的位由1補(bǔ)齊)1001011011100101右移兩位位操作符&(AND)兩個(gè)數(shù)進(jìn)行位的操作,兩個(gè)位都為“1”時(shí),才為“1”,否則為“0”|(OR)兩個(gè)數(shù)進(jìn)行位的操作,兩個(gè)位只要有一個(gè)為“1”,就為“1”,全部為“0”時(shí),則為“0”(XOR)兩個(gè)位不同結(jié)果為“1”,兩個(gè)位相同則“0”單目操作符就是只接受一個(gè)操作數(shù)的操作符(運(yùn)算符)!執(zhí)行邏輯反操作,真變假,假變?yōu)檎媲笱a(bǔ)操作,位原為“1”變?yōu)椤?”,位原為“0”變?yōu)椤?”&獲取操作數(shù)的地址,一般用于存儲(chǔ)指針*與指針一起使用,用于獲取指針?biāo)赶虻闹担琲nt *b;int a=1;b=&a
44、mp;a;printf(“%dn”,*b);sizeof獲取操作數(shù)的字節(jié)長(zhǎng)度自創(chuàng)函數(shù)(方法函數(shù))詳解注意:注意:1、包含的內(nèi)容可以省略,數(shù)據(jù)類型說(shuō)明省略,默認(rèn)是int類型函數(shù);參數(shù)省略表示該函數(shù)是無(wú)參函數(shù),參數(shù)不省略表示該函數(shù)是有參函數(shù);2、函數(shù)名稱遵循標(biāo)識(shí)符命名規(guī)范;3、自定義函數(shù)盡量放在main函數(shù)之前,如果要放在main函數(shù)后面的話,需要在main函數(shù)之前先聲明自定義函數(shù),聲明格式為:數(shù)據(jù)類型說(shuō)明 函數(shù)名稱(參數(shù));例如果在main函數(shù)之后,申明了自定義函數(shù),在前面需要定義函數(shù)名#include<stdio.h>void find();/在main函數(shù)之前定義函數(shù)int ma
45、in()find();return 0;void find()printf("自定義函數(shù)如果在main函數(shù)后面定義,就需要在main函數(shù)前面先定義");有參和無(wú)參函數(shù)形參和實(shí)參函數(shù)的參數(shù)分為形參和實(shí)參兩種,形參是在定義函數(shù)名和函數(shù)體的時(shí)候使用的參數(shù),目的是用來(lái)接收調(diào)用該函數(shù)時(shí)傳入的參數(shù),實(shí)參是在調(diào)用時(shí)傳遞該函數(shù)的參數(shù)。· 形參只有在被調(diào)用時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí),即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。· 實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,無(wú)論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí)
46、,它們都必須具有確定的值,以便把這些值傳送給形參。因此應(yīng)預(yù)先用賦值等辦法使實(shí)參獲得確定值。· 在參數(shù)傳遞時(shí),實(shí)參和形參在數(shù)量上,類型上,順序上應(yīng)嚴(yán)格一致,否則會(huì)發(fā)生類型不匹配”的錯(cuò)誤。例如:以下函數(shù)multiDouble(int x)實(shí)現(xiàn)把x乘以2再返回給函數(shù)調(diào)用處。外部調(diào)用的函數(shù)當(dāng)a文件中的b函數(shù),被c文件調(diào)用時(shí),一般需要在調(diào)用前先申明函數(shù)原型。但是其實(shí),只要函數(shù)返回類型不為整型,就可以不申明函數(shù)原型,但是不建議這么,因?yàn)榕鲁霈F(xiàn)無(wú)法預(yù)料的問(wèn)題遞歸函數(shù)(自己調(diào)用自己)例(算n的階乘)/*遞歸算n的階乘*/int factorial(int n)int result;if(n<0
47、)printf("輸入錯(cuò)誤!n");return 0;else if(n=0|n=1)result=1;elseresult=factorial(n-1)*n;/調(diào)用自身return result;int main()int n=5;printf("%d的階乘=%d",n,factorial(n);return 0;例(小明第一天記1個(gè)單詞,第二天記2個(gè)單詞,第10天時(shí),學(xué)會(huì)了多少個(gè)單詞)注意:記和學(xué),是兩碼是事第一天:記了1個(gè);第二天:記了2個(gè)+第1天記1個(gè)=3個(gè);第三天:記了3個(gè)+第1天記1個(gè)+第二天記2個(gè)=6個(gè);第四天:記了4個(gè)+第1天記1個(gè)+第二
48、天記2個(gè)+第三天記3個(gè)=10個(gè);第十天:記了10個(gè)+第1天記1個(gè)=55個(gè);/* 定義獲取單詞數(shù)量的函數(shù) */int getWordNumber(int n) if(n = 1)return 1; /第一天只會(huì)1個(gè)單詞elsereturn getWordNumber(n-1)+n; /到第天會(huì)的單詞數(shù)量int main()int num = getWordNumber(10); /獲取會(huì)了的單詞數(shù)量printf("小明第10天記了:%d個(gè)單詞。n", num);return 0;由階乘算法,詳解遞歸 遞歸函數(shù)特點(diǎn):1. 每一級(jí)函數(shù)調(diào)用時(shí)都有自己的變量,但是函數(shù)代碼并不會(huì)得到復(fù)
49、制,如計(jì)算5的階乘時(shí)每遞推一次變量都不同;2. 每次調(diào)用都會(huì)有一次返回,如計(jì)算5的階乘時(shí)每遞推一次都返回進(jìn)行下一次;3. 遞歸函數(shù)中,位于遞歸調(diào)用前的語(yǔ)句和各級(jí)被調(diào)用函數(shù)具有相同的執(zhí)行順序;4. 遞歸函數(shù)中,位于遞歸調(diào)用后的語(yǔ)句的執(zhí)行順序和各個(gè)被調(diào)用函數(shù)的順序相反;5. 遞歸函數(shù)中必須有終止語(yǔ)句。6. 一句話總結(jié)遞歸:自我調(diào)用且有完成狀態(tài)。例:猴子第一天摘下N個(gè)桃子,當(dāng)時(shí)就吃了一半,還不過(guò)癮,就又多吃了一個(gè)。第二天又將剩下的桃子吃掉一半,又多吃了一個(gè)。以后每天都吃前一天剩下的一半零一個(gè)。到第10天在想吃的時(shí)候就剩一個(gè)桃子了,問(wèn)第一天共摘下來(lái)多少個(gè)桃子?并反向打印每天所剩桃子數(shù)。int getP
50、eachNumber(int n)int num; /定義所剩桃子數(shù)if(n=10) return 1; /遞歸結(jié)束條件 elsenum = (getPeachNumber(n+1)+1)*2; /這里是不應(yīng)該用遞歸呢?printf("第%d天所剩桃子%d個(gè)n", n, num); /天數(shù),所剩桃子個(gè)數(shù)return num;int main()int num = getPeachNumber(1);printf("猴子第一天摘了:%d個(gè)桃子。n", num);return 0;例:/*有5個(gè)人坐在一起,問(wèn)第5個(gè)人多少歲?他說(shuō)比第4個(gè)人大2歲。問(wèn)第4個(gè)人歲
51、數(shù),他說(shuō)比第3個(gè)人大2歲。問(wèn)第3個(gè)人,又說(shuō)比第2人大兩歲。問(wèn)第2個(gè)人,說(shuō)比第1個(gè)人大兩歲。最后 問(wèn)第1個(gè)人,他說(shuō)是10歲。請(qǐng)問(wèn)第5個(gè)人多大?*/int getAgeOfFifth(int n)if(n=1)return 10;elsereturn getAgeOfFifth(n-1)+2;int main() printf("第5個(gè)人的年齡是%d歲", getAgeOfFifth(5); return 0;局部與全局局部變量 局部變量也稱為內(nèi)部變量。局部變量是在函數(shù)內(nèi)作定義說(shuō)明的。其作用域僅限于函數(shù)內(nèi), 離開(kāi)該函數(shù)后再使用這種變量是非法的。在復(fù)合語(yǔ)句中也可定義變量,其作用域
52、只在復(fù)合語(yǔ)句范圍內(nèi)。全局變量全局變量也稱為外部變量,它是在函數(shù)外部定義的變量。它不屬于哪一個(gè)函數(shù),它屬于一個(gè)源程序文件。其作用域是整個(gè)源程序。局部變量和全局可以標(biāo)識(shí)符(變量名)可以相同,調(diào)用時(shí),優(yōu)先調(diào)用局部變量例例/*局部與全局變量*/int x = 77;void fn1()printf("fn1(): x=%dn", x); int main()int x = 10;if(x>0)int x=10;x = 100;x /= 2;printf("if語(yǔ)句內(nèi), x=%dn", x); printf("main方法內(nèi), x=%dn", x);fn1();return 0;存儲(chǔ)類別C語(yǔ)言根據(jù)變量的生存周期來(lái)劃分,可以分為靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式。靜態(tài)存儲(chǔ)方式:是指在程序運(yùn)行期間分配固定的存儲(chǔ)空間的方式。靜態(tài)存儲(chǔ)區(qū)中存放了在整個(gè)程序執(zhí)行過(guò)程中都存在的變量,如全局變量。動(dòng)態(tài)存儲(chǔ)方式:是指在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。動(dòng)態(tài)存儲(chǔ)區(qū)中存放的變量是根據(jù)程序運(yùn)行的需要而建立和釋放的,通常包括:函數(shù)形式參數(shù);自動(dòng)變量;函數(shù)調(diào)用時(shí)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年浙教版九年級(jí)地理下冊(cè)階段測(cè)試試卷
- 2025年粵教新版九年級(jí)歷史上冊(cè)月考試卷含答案
- 2025年中圖版選擇性必修3歷史上冊(cè)月考試卷含答案
- 2025年滬教版八年級(jí)歷史下冊(cè)階段測(cè)試試卷含答案
- 2025年人教新起點(diǎn)高一語(yǔ)文上冊(cè)月考試卷
- 遵義醫(yī)藥高等專科學(xué)?!冬F(xiàn)代漢語(yǔ)語(yǔ)法研究》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五年度出租車行業(yè)駕駛員安全責(zé)任合同范本4篇
- 二零二五年度出租車公司車輛調(diào)度合同3篇
- 房屋贈(zèng)與合同范本(2篇)
- 2025年度農(nóng)機(jī)保險(xiǎn)代理銷售合同范本4篇
- 蛋糕店服務(wù)員勞動(dòng)合同
- 土地買賣合同參考模板
- 2025高考數(shù)學(xué)二輪復(fù)習(xí)-專題一-微專題10-同構(gòu)函數(shù)問(wèn)題-專項(xiàng)訓(xùn)練【含答案】
- 新能源行業(yè)市場(chǎng)分析報(bào)告
- 2025年天津市政建設(shè)集團(tuán)招聘筆試參考題庫(kù)含答案解析
- 巖土工程勘察.課件
- 60歲以上務(wù)工免責(zé)協(xié)議書
- 滋補(bǔ)類用藥的培訓(xùn)
- 北師大版高三數(shù)學(xué)選修4-6初等數(shù)論初步全冊(cè)課件【完整版】
- 高職《勞動(dòng)教育》指導(dǎo)綱要
- XX公司年會(huì)活動(dòng)報(bào)價(jià)單
評(píng)論
0/150
提交評(píng)論