C語(yǔ)言常見(jiàn)問(wèn)題解析_第1頁(yè)
C語(yǔ)言常見(jiàn)問(wèn)題解析_第2頁(yè)
C語(yǔ)言常見(jiàn)問(wèn)題解析_第3頁(yè)
C語(yǔ)言常見(jiàn)問(wèn)題解析_第4頁(yè)
C語(yǔ)言常見(jiàn)問(wèn)題解析_第5頁(yè)
已閱讀5頁(yè),還剩62頁(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)介

INTRODUCTIONFORRUIJIEC語(yǔ)言常見(jiàn)問(wèn)題解析文檔密級(jí):網(wǎng)研3部張炯煌目錄Contents一、關(guān)鍵字二、符號(hào)三、預(yù)處理四、指針和數(shù)組五、位(bit)和字節(jié)(byte)六、常用庫(kù)函數(shù)/系統(tǒng)函數(shù)目的描述C語(yǔ)言一些基本要素;解析一些容易造成困惑的基本問(wèn)題,如:約定、關(guān)鍵字和術(shù)語(yǔ);內(nèi)容基礎(chǔ)、簡(jiǎn)單,可以了解一些細(xì)節(jié);區(qū)分需要理解的和需要記憶的;Page3關(guān)鍵字registerstatic基本數(shù)據(jù)類型sizeofsigned、unsignedif、elseswitch、casedo、while、forvoidreturnconststructvolatiletypedef關(guān)鍵字標(biāo)準(zhǔn)定義:32個(gè)關(guān)鍵字Page5關(guān)鍵字——register注意:register變量必須是CPU寄存器所接受的類型,即必須為單個(gè)的值,且長(zhǎng)度小于或等于整型的長(zhǎng)度;register變量可能不存放與內(nèi)存中,不能用取址運(yùn)算符“&”獲取變量地址;Page6關(guān)鍵字——static修飾變量作用:可修訂局部、全局變量,兩者都在內(nèi)存靜態(tài)區(qū);注意:靜態(tài)全局變量作用域從定義之處開(kāi)始,到文件結(jié)尾處結(jié)束。在定義之前的代碼無(wú)法使用,除非加extern聲明;修飾函數(shù)作用:使函數(shù)的作用域僅局限于本文件;好處:不用擔(dān)心定義的函數(shù)是否會(huì)與其他文件中的函數(shù)同名;Page7關(guān)鍵字——基本數(shù)據(jù)類型數(shù)據(jù)類型:short、int、long、char、float、doublePage8關(guān)鍵字——sizeof問(wèn)1:以下值分別是多少?inti=0;A)sizeof(i);B)sizeof(int);C)sizeofi;D)sizeofint;Page9答1:sizeof是關(guān)鍵字,非函數(shù),注意:1、計(jì)算變量空間大小時(shí),括號(hào)可以省略;2、計(jì)算類型空間大小時(shí),括號(hào)不能省略;3、不管變量、類型,不要偷懶;關(guān)鍵字——signed、unsigned注意:缺省情況下,數(shù)據(jù)為signed類型;計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼表示,原因是補(bǔ)碼可以將符號(hào)位和其他位統(tǒng)一處理,減法也可按加法處理;兩個(gè)用補(bǔ)碼表示的數(shù)相加時(shí),如最高位(符號(hào)位)有進(jìn)位,則進(jìn)位被舍棄。

正數(shù)的補(bǔ)碼:與原碼一致;

負(fù)數(shù)的補(bǔ)碼:符號(hào)位為1,其他位為該數(shù)絕對(duì)值的原碼按位取反,后整個(gè)數(shù)加1;Page10關(guān)鍵字——signed/unsigned思考:1、-0、+0,在內(nèi)存中分別怎么存儲(chǔ);2、inti=-20;unsignedj=10;i+j的值是多少?3、unsignedinti;for(i=9;i>=0;i--){printf("%u\n",i);}Page11答案:關(guān)鍵字——if、else注意:else始終與同一括號(hào)內(nèi)最近的未匹配if語(yǔ)句結(jié)合,為避免代碼難以閱讀,分界符“{”“}”不能??;空語(yǔ)句if(p!=NULL);fun();

分號(hào)被解析成空語(yǔ)句,從而導(dǎo)致fun()總是被調(diào)用。Page12關(guān)鍵字——switch、case規(guī)則:每個(gè)case語(yǔ)句的結(jié)尾不要忘了加break,否則導(dǎo)致分支重疊;最后必須使用default分支,即使程序不需要default處理,也必須保留;簡(jiǎn)化每種case對(duì)應(yīng)的操作;易于分類、處理簡(jiǎn)單的數(shù)據(jù)才使用case語(yǔ)句;default語(yǔ)句只能用于檢查真正的默認(rèn)處理;注意:case后面只能是整型或者字符型的常量或常量表達(dá)式;Page13關(guān)鍵字——do、while、for循環(huán)語(yǔ)句:while循環(huán)、do-while循環(huán)、for循環(huán)循環(huán)終止:break、continue

break:終止本層循環(huán);

continue:終止本次(本輪)循環(huán)注意:多重循環(huán)中,盡量將長(zhǎng)的循環(huán)放在最里層,短的循環(huán)放在最外層,減少CPU跨切循環(huán)層的次數(shù);建議for語(yǔ)句的循環(huán)控制變量的取值采用“半開(kāi)半閉區(qū)間”寫(xiě)法;

for(i=0;i<10;i++)

/

for(i=0;i<=9;i++)不能在for循環(huán)體內(nèi)修改循環(huán)變量,防止循環(huán)失控;Page14關(guān)鍵字——void作用:修飾函數(shù)返回;修飾函數(shù)參數(shù);修飾指針;注意:無(wú)法定義void變量;“空類型”能包含“有類型”,但“有類型”不能包含“空類型”;不加返回值說(shuō)明的函數(shù),為int函數(shù);函數(shù)無(wú)參數(shù),應(yīng)聲明其參數(shù)為void;(編碼規(guī)范)Page15關(guān)鍵字——void指針ANSI標(biāo)準(zhǔn)定義,不能對(duì)void指針進(jìn)行算法操作,如下:void*p;p++; //ANSI:錯(cuò)誤p+=1; //ANSI:錯(cuò)誤GNU定義,對(duì)void*的算法操作與char*一致,如下:void*p;p++; //GNU:正確p+=1; //GNU:正確為符合ANSI標(biāo)準(zhǔn),提高可移植性,可如下:void*p;(char*)p++; //ANSI:正確;GNU:正確(char*)p+=1; //ANSI:正確;GNU:正確Page16關(guān)鍵字——return注意:不可返回指向“棧內(nèi)存”的“指針”,因?yàn)樵搩?nèi)存在函數(shù)體結(jié)束后自動(dòng)銷毀;Return的值最好加括號(hào),尤其是返回一個(gè)表達(dá)式的值時(shí);Page17char*func(void){chara[10];return(a);<--返回棧內(nèi)存指針,錯(cuò)誤}關(guān)鍵字——const作用:修飾一般變量;修飾數(shù)組;修飾指針;修飾函數(shù)參數(shù);修飾函數(shù)返回值;原理:編譯器通常不為普通const只讀變量分配存儲(chǔ)空間,而是保存于符號(hào)表中,從而成為一個(gè)編譯期間的值,沒(méi)有存儲(chǔ)與讀內(nèi)存的操作,效率更高;Page18關(guān)鍵字——const注意:const修飾的變量,必須在定義的同時(shí)初始化;(為什么?)修飾一般變量、數(shù)組時(shí),const可在類型說(shuō)明符前,也可在后;如:intconsti=1;

<==>

constinti=1;修飾指針時(shí),忽略類型名,看const離哪個(gè)近就修飾哪個(gè);Page19

constint*p; //修飾*p,p指向的對(duì)象不可變;

intconst*p; //修飾*p,p指向的對(duì)象不可變;

int*constp; //修飾p,p不可變,p指向的對(duì)象可變;constint*constp; //p和p指向的對(duì)象都不可變;關(guān)鍵字——volatile作用:告訴編譯器對(duì)訪問(wèn)該變量的代碼不進(jìn)行優(yōu)化,提供對(duì)特殊地址的穩(wěn)定訪問(wèn);Page20關(guān)鍵字——struct注意:柔性數(shù)組:柔性數(shù)組不是結(jié)構(gòu)體的正式成員,只是使用柔性數(shù)組時(shí)需要把它當(dāng)作結(jié)構(gòu)體的一個(gè)成員;Page21問(wèn)1:

typedefstructa_s{inti;inta[];}a_t;

sizeof(a_t)=?答1:4關(guān)鍵字——union注意:所有成員具有相同的起始地址;只分配一個(gè)足夠大的空間來(lái)容納最大長(zhǎng)度的成員;Page22關(guān)鍵字——uniontypedefuniontest_u{inti;charch;}test_t;test_tc;問(wèn)1:如果c.i=1此時(shí)c.ch=?,c.i=?問(wèn)2:如果c.ch=1;此時(shí)c.ch=?,c.i=?;Page23關(guān)鍵字——unionPage24對(duì)union型結(jié)構(gòu)成員的存取都是相對(duì)于該聯(lián)合體基地址的0偏移開(kāi)始,即聯(lián)合體的訪問(wèn)都是從union的首地址位置開(kāi)始。大端存儲(chǔ)模式下:c.i=1(低字節(jié)存放在高地址)c.ch=1(首地址位置存取)低高低高|00|00|00|01| |01|00|00|00|小端存儲(chǔ)模式下:c.i=1(低字節(jié)存放在低地址) c.ch=1(首地址位置存取)低高 低高|01|00|00|00| |01|00|00|00|關(guān)鍵字——typedef作用:給一個(gè)已經(jīng)存在的數(shù)據(jù)類型取一個(gè)別名,而非定義一個(gè)新的數(shù)據(jù)類型;Page25問(wèn)1:#defineINT32intunsignedINT32i=1;問(wèn)2:typedefintINT32unsignedINT32i=1;答1:預(yù)編譯時(shí)進(jìn)行替代,正常使用答2:編譯失敗,typedef取的別名不支持這種類型擴(kuò)展符號(hào)注釋符(/)接續(xù)符和轉(zhuǎn)義符(\)單引號(hào)、雙引號(hào)(’’、””)邏輯運(yùn)算符(||、&&)位運(yùn)算符(&、|、^、~、<<、>>)花括號(hào)({})++、--逗號(hào)運(yùn)算符(,)符號(hào)——基本符號(hào)30個(gè)(?),每個(gè)符號(hào)可能同時(shí)有多重含義,符號(hào)間又可相互組合Page27符號(hào)——注釋符(/)注意:1、斜杠(/)和星號(hào)(*)之間沒(méi)有空格,會(huì)被當(dāng)作注釋的開(kāi)始Page28問(wèn)1:以下表達(dá)式是否合法?y=x/*p;答1:編譯失敗,可修改為:y=x/*p;y=x/(*p);符號(hào)——接續(xù)符和轉(zhuǎn)義符(\)注意:用作接續(xù)符時(shí),表示斷行,編譯器會(huì)將反斜杠剔除,反斜杠之后不能有空格;用作轉(zhuǎn)義符時(shí),作為轉(zhuǎn)義符號(hào)的開(kāi)始標(biāo)識(shí);Page29符號(hào)——單引號(hào)、雙引號(hào)(’’、””)注意:?jiǎn)我?hào)引起來(lái)的是字符常量;雙引號(hào)引起來(lái)的是字符串常量;Page30問(wèn)1:以下三者區(qū)別?1,'1',"1“問(wèn)2:charc;c=‘a(chǎn)bc’;printf("%d\n",c);答1:第一個(gè)是整型常數(shù),32位系統(tǒng)下占4個(gè)字節(jié);第二個(gè)是字符常量,占1個(gè)字節(jié);第三個(gè)是字符串常量,占2個(gè)字節(jié);答2:99,(?)符號(hào)——邏輯運(yùn)算符(||、&&)注意:邏輯運(yùn)算符||與&&的條件判斷規(guī)則;Page31問(wèn)1:inti=0;intj=0;if((++i>0)||(++j>0)){printf("%d,%d\n",i,j);}答1:1,0符號(hào)——位運(yùn)算符(&、|、^、~、<<、>>)注意:左移“<<”:高位丟棄,低位補(bǔ)0;右移“>>”:對(duì)于有符號(hào)數(shù),符號(hào)位隨同移動(dòng),正數(shù)最高位補(bǔ)0;負(fù)數(shù)符號(hào)位為1,最高位補(bǔ)0或補(bǔ)1取決于編譯系統(tǒng);Page32問(wèn)1:inti=0;i=(-1);printf("%d%d%d\n",j,(j<<1),(j>>1));問(wèn)2:inti=0;i=(0x80000001);printf("%d%d%d\n",j,(j<<1),(j>>1));答1:-1-2-1(系統(tǒng)決定)答2:-2147483647(0x80000001),2(0x2),-1073741824(0xc0000000)符號(hào)——花括號(hào)({})作用:打包,把一些語(yǔ)句或者代碼包起來(lái),形成一個(gè)整體,并與外界絕緣(局部程序塊);Page33Page33問(wèn)1:以下定義哪些合法?A)chara[10]="abcde";B)chara[10]={"abcde"};C)chara[10]{="abcde"};答1:A、B合法符號(hào)——局部程序塊({})intmain(){intval;

val=1;

{intval;

val=2;printf("val:%d\n",val);}printf("val:%d\n",val);}Page34符號(hào)——局部程序塊({})局部程序塊:指一對(duì)大括號(hào)({})之間的一段C語(yǔ)言程序,包括: 1、C函數(shù); 2、if語(yǔ)句、swich語(yǔ)句等; 3、獨(dú)立創(chuàng)建局部程序塊,不使用C函數(shù)或基本的C語(yǔ)句;局部變量:局部程序塊中說(shuō)明的變量,注意:

1、在局部程序塊的開(kāi)始部分說(shuō)明,且只在說(shuō)明它的局部程序塊中有效;

2、如果局部變量與局部程序塊以外的變量重名,則前者優(yōu)先于后者;Page35符號(hào)——局部程序塊({})問(wèn)1:intmain(){{intval;

val=1;}

printf("val:%d\n",val);

return0;}Page36問(wèn)2:{intval;

val=1;}intmain(){printf("runtime...\n");return0;}符號(hào)——++、--Page37問(wèn)1:

inti=3;((++i)+(++i)+(++i));等于多少?問(wèn)2:

inti=3;((i++)+(i++)+(i++));等于多少?問(wèn)3:

inti=3,j;j=(i++,i++,i++);等于多少?問(wèn)4:inti=3,j;j=i++,i++,i++;j等于多少?答1:C標(biāo)準(zhǔn)未規(guī)定,可能經(jīng)過(guò)3次自加后再相加,為18;也可能先計(jì)算第一個(gè)”+”,再計(jì)算第二個(gè)”+”,為16;答2:9,遇到分發(fā)才認(rèn)為本計(jì)算單位結(jié)束,這時(shí)自加;答3:5,逗號(hào)表達(dá)式,i在遇到每個(gè)逗號(hào)后,認(rèn)為本單位計(jì)算已結(jié)束,自加答4:(?)符號(hào)——逗號(hào)運(yùn)算符(,)通常用來(lái)分隔變量說(shuō)明、函數(shù)參數(shù)、表達(dá)式以及for語(yǔ)句中的元素Page38符號(hào)——逗號(hào)運(yùn)算符(,)voidmain(){inti,j,k;<分隔變量說(shuō)明

i=0,j=1,k=2; <分隔變量初始化

printf("i=%d,j=%d,k=%d\n",i,j,k);i=(j++,k++); <分隔表達(dá)式

printf("i=%d,j=%d,k=%d\n",i,j,k);while(i=(rand()%100),i!=50){

printf("iis%d,tryingagain...\n",i)}}Page39i=(j++,k++);這條語(yǔ)句完成三個(gè)動(dòng)作,依次為:(1)把k值賦給i,因?yàn)樽笾?lvaule)總是等于最右邊的參數(shù),本例的左值等于k。(2)j自增。(3)k自增。while(i=(rand()%100),i!=50)將兩個(gè)表達(dá)式隔開(kāi),(1)把0至99之間的一個(gè)隨機(jī)數(shù)賦給i;(2)用來(lái)判斷i是否不等于50。符號(hào)——一些容易出錯(cuò)的優(yōu)先級(jí)問(wèn)題Page40預(yù)處理指針與數(shù)組指針數(shù)組數(shù)組首元素的地址和數(shù)組的首地址指針與數(shù)組指針數(shù)組和數(shù)組指針二維數(shù)組數(shù)組參數(shù)和指針參數(shù)函數(shù)指針指針Page43指針注意:NULL和0的意思不同,不要混淆;Page44數(shù)組Page45問(wèn):inta[5];sizeof(a)的值?sizeof(a[0])的值?sizeof(a[5])的值?sizeof(&a[0])的值?sizeof(&a)的值?答:sizeof(a):sizeof(int)*5,為20字節(jié),即數(shù)組整塊內(nèi)存的大?。?2位系統(tǒng)下,下同);sizeof(a[0]):sizeof(int),為4字節(jié);sizeof(a[5]):4字節(jié),因?yàn)閟izeof是關(guān)鍵字(不是函數(shù)),函數(shù)求值是在運(yùn)行的時(shí)候,而關(guān)鍵字sizeof求值是在編譯的時(shí)候,雖然a[5]這個(gè)元素不存在,但是這并沒(méi)有真正訪問(wèn)a[5],而僅僅是根據(jù)數(shù)組元素的類型來(lái)確定其值,所以這里使用a[5]不會(huì)出錯(cuò);sizeof(&a[0]):4字節(jié),即取元素a[0]的首地址;sizeof(&a):4字節(jié),即取數(shù)組a的首地址(注:某些編譯器下為20);數(shù)組的首地址和數(shù)組首元素的地址Page46問(wèn):以下程序輸出intmain(){inta[5]={1,2,3,4,5};int*prt=(int*)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));retur0;}答:對(duì)指針進(jìn)行加1操作,移動(dòng)一個(gè)指針類型大小的偏移;&a+1:取數(shù)組a的首地址,+1相當(dāng)于指針移動(dòng)了整個(gè)數(shù)組的長(zhǎng)度,相當(dāng)于下一個(gè)數(shù)組的首地址,即指針已越界;*(a+1):a是數(shù)組首元素的地址,即a[0]的地址(&a[0]),+1相當(dāng)于移動(dòng)一個(gè)數(shù)組元素的長(zhǎng)度,即a[1]的地址注意:a和&a的雖然值是一樣的,但意義完全不同;數(shù)組和指針注意:數(shù)組可以存任何類型的數(shù)據(jù),但不能存函數(shù);兩者都可用“以指針形式”或者“以下標(biāo)形式”進(jìn)行訪問(wèn);指針是完全的匿名訪問(wèn),即訪問(wèn)的內(nèi)存塊沒(méi)有名字;數(shù)組是典型的具名+匿名訪問(wèn),對(duì)數(shù)組的元素的訪問(wèn)需要先根據(jù)數(shù)組的名字找到數(shù)組首元素的地址,然后根據(jù)偏移量找到相應(yīng)的值;Page47指針數(shù)組和數(shù)組指針指針數(shù)組:是一個(gè)數(shù)組,元素都是指針,數(shù)組占多少個(gè)字節(jié)由數(shù)組本身決定,即“儲(chǔ)存指針的數(shù)組”;int*p1[10];“[]”的優(yōu)先級(jí)比“*”高,p1先與“[]”結(jié)合,構(gòu)成一個(gè)數(shù)組的定義,數(shù)組名為p1,int*修飾的是數(shù)組的內(nèi)容,即數(shù)組的每個(gè)元素;Page48數(shù)組指針:是一個(gè)指針,指向一個(gè)數(shù)組,在32位系統(tǒng)下占用4個(gè)字節(jié),不知道它指向的數(shù)組占多少字節(jié),即“指向數(shù)組的指針”。int(*p2)[10];“()”的優(yōu)先級(jí)比“[]”高,“*”和p2構(gòu)成一個(gè)指針的定義,指針變量名為p2,int修飾的是數(shù)組的內(nèi)容即數(shù)組的每個(gè)元素、數(shù)組在這里并沒(méi)有名字,是個(gè)匿名數(shù)組。相當(dāng)于int(*)[10]p2;指針數(shù)組和數(shù)組指針Page49指針數(shù)組和數(shù)組指針Page50問(wèn):我司交換機(jī)/WLAN產(chǎn)品上,以下程序打印結(jié)果?intmain(){inta[4]={1,2,3,4};int*p1=(int*)((int)a+1);printf("%x.\n",*p1);return0;}答:a被強(qiáng)制轉(zhuǎn)化為int型,(int)a+1的值為元素a[0]的第二個(gè)字節(jié)的地址,把這個(gè)地址強(qiáng)制轉(zhuǎn)化成int

*類型的值賦給p1,也即*p1的值為a[0]的第二個(gè)字節(jié)開(kāi)始的連續(xù)4個(gè)byte的內(nèi)容。內(nèi)存布局與系統(tǒng)的字節(jié)序有關(guān),大端模式下數(shù)組a[4]內(nèi)存分布如下:低地址高地址|00000001|00000002|00000003|00000004|

a[0]a[1]a[2]a[3]

從而*p1的值為?二維數(shù)組注意:編譯器總是將二維數(shù)組看成是一個(gè)一維數(shù)組,而一維數(shù)組的每一個(gè)元素又都是一個(gè)數(shù)組;內(nèi)存分布:inta[4][3];Page51二維數(shù)組Page52問(wèn):intmain(){inta[5][5];int(*p)[4];p=a;printf("%d\n",(&p[4][2]-&a[4][2]));return0;}明確指針指向的內(nèi)存是什么,畫(huà)內(nèi)存分布圖答:數(shù)組名a作為右值時(shí),代表數(shù)組首元素的地址,a可看作是包含5個(gè)元素的一維數(shù)組(每個(gè)元素是一個(gè)一維數(shù)組),則a表示a[0]的首地址,a+1相當(dāng)于a向后移動(dòng)5個(gè)int型的長(zhǎng)度,表示一維數(shù)組a的第2個(gè)元素,

所以:&a[4][2]=&

溫馨提示

  • 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)論