久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区

Rss & SiteMap

曙海教育集團(tuán)論壇 http://www.bjzhda.cn

曙海教育集團(tuán)論壇
共1 條記錄, 每頁顯示 10 條, 頁簽: [1]
[瀏覽完整版]

標(biāo)題:給粗心的C語言初學(xué)者(1)

1樓
wangxinxin 發(fā)表于:2010-12-10 14:48:11
0 簡介

C語言及其典型實(shí)現(xiàn)被設(shè)計(jì)為能被專家們?nèi)菀椎厥褂谩_@門語言簡潔并附有表達(dá)力。但有一些限制可以保護(hù)那些浮躁的人。一個浮躁的人可以從這些條款中獲得一些幫助。


在本文中,我們將會看一看這些未可知的益處。這是由于它的未可知,我們無法為其進(jìn)行完全的分類。不過,我們?nèi)匀煌ㄟ^研究為了一個C程序的運(yùn)行所需要做的事來做到這些。我們假設(shè)讀者對C語言至少有個粗淺的了解。


第一部分研究了當(dāng)程序被劃分為記號時會發(fā)生的問題。第二部分繼續(xù)研究了當(dāng)程序的記號被編譯器組合為聲明、表達(dá)式和語句時會出現(xiàn)的問題。第三部分研究了由多個部分組成、分別編譯并綁定到一起的C程序。第四部分處理了概念上的誤解:當(dāng)一個程序具體執(zhí)行時會發(fā)生的事情。第五部分研究了我們的程序和它們所使用的常用庫之間的關(guān)系。在第六部分中,我們注意到了我們所寫的程序也不并不是我們所運(yùn)行的程序;預(yù)處理器將首先運(yùn)行。最后,第七部分討論了可移植性問題:一個能在一個實(shí)現(xiàn)中運(yùn)行的程序無法在另一個實(shí)現(xiàn)中運(yùn)行的原因。


1 詞法缺陷

編譯器的第一個部分常被稱為詞法分析器(lexical analyzer)。詞法分析器檢查組成程序的字符序列,并將它們劃分為記號(token)一個記號是一個有一個或多個字符的序列,它在語言被編譯時具有一個(相關(guān)地)統(tǒng)一的意義。在C中, 例如,記號->的意義和組成它的每個獨(dú)立的字符具有明顯的區(qū)別,而且其意義獨(dú)立于->出現(xiàn)的上下文環(huán)境。


另外一個例子,考慮下面的語句:


if(x > big) big = x;


該語句中的每一個分離的字符都被劃分為一個記號,除了關(guān)鍵字if和標(biāo)識符big的兩個實(shí)例。


事實(shí)上,C程序被兩次劃分為記號。首先是預(yù)處理器讀取程序。它必須對程序進(jìn)行記號劃分以發(fā)現(xiàn)標(biāo)識宏的標(biāo)識符。它必須通過對每個宏進(jìn)行求值來替換宏調(diào)用。最后,經(jīng)過宏替換的程序又被匯集成字符流送給編譯器。編譯器再第二次將這個流劃分為記號。


在這一節(jié)中,我們將探索對記號的意義的普遍的誤解以及記號和組成它們的字符之間的關(guān)系。稍后我們將談到預(yù)處理器。


1.1 = 不是 ==

從Algol派生出來的語言,如Pascal和Ada,用:=表示賦值而用=表示比較。而C語言則是用=表示賦值而用==表示比較。這是因?yàn)橘x值的頻率要高于比較,因此為其分配更短的符號。


此外,C還將賦值視為一個運(yùn)算符,因此可以很容易地寫出多重賦值(如a = b = c),并且可以將賦值嵌入到一個大的表達(dá)式中。


這種便捷導(dǎo)致了一個潛在的問題:可能將需要比較的地方寫成賦值。因此,下面的語句好像看起來是要檢查x是否等于y:


if(x = y)
foo();


而實(shí)際上是將x設(shè)置為y的值并檢查結(jié)果是否非零。在考慮下面的一個希望跳過空格、制表符和換行符的循環(huán):


while(c == ' ' || c = '\t' || c == '\n')
c = getc(f);


在與'\t'進(jìn)行比較的地方程序員錯誤地使用=代替了==。這個“比較”實(shí)際上是將'\t'賦給c,然后判斷c的(新的)值是否為零。因?yàn)?\t'不為零,這個“比較”將一直為真,因此這個循環(huán)會吃盡整個文件。這之后會發(fā)生什么取決于特定的實(shí)現(xiàn)是否允許一個程序讀取超過文件尾部的部分。如果允許,這個循環(huán)會一直運(yùn)行。


一些C編譯器會對形如e1 = e2的條件給出一個警告以提醒用戶。當(dāng)你趨勢需要先對一個變量進(jìn)行賦值之后再檢查變量是否非零時,為了在這種編譯器中避免警告信息,應(yīng)考慮顯式給出比較符。換句話說,將:


if(x = y)
foo();


改寫為:


if((x = y) != 0)
foo();


這樣可以清晰地表示你的意圖。


1.2 & 和 | 不是 && 和 ||

容易將==錯寫為=是因?yàn)楹芏嗥渌Z言使用=表示比較運(yùn)算。 其他容易寫錯的運(yùn)算符還有&和&&,或|和||,這主要是因?yàn)镃語言中的&和|運(yùn)算符于其他語言中具有類似功能的運(yùn)算符大為不同。我們將在第4節(jié)中貼近地觀察這些運(yùn)算符。


1.3 多字符記號

一些C記號,如/、*和=只有一個字符。而其他一些C記號,如/*和==,以及標(biāo)識符,具有多個字符。當(dāng)C編譯器遇到緊連在一起的/和*時,它必須能夠決定是將這兩個字符識別為兩個分離的記號還是一個單獨(dú)的記號。C語言參考手冊說明了如何決定:“如果輸入流到一個給定的字符串為止已經(jīng)被識別為記號,則應(yīng)該包含下一個字符以組成能夠構(gòu)成記號的最長的字符串”。因此,如果/是一個記號的第一個字符,并且/后面緊隨了一個*,則這兩個字符構(gòu)成了注釋的開始,不管其他上下文環(huán)境。


下面的語句看起來像是將y的值設(shè)置為x的值除以p所指向的值:


y = x/*p /* p 指向除數(shù) */;


實(shí)際上,/*開始了一個注釋,因此編譯器簡單地吞噬程序文本,直到*/的出現(xiàn)。換句話說,這條語句僅僅把y的值設(shè)置為x的值,而根本沒有看到p。將這條語句重寫為:


y = x / *p /* p 指向除數(shù) */;


或者干脆是


y = x / (*p) /* p指向除數(shù) */;


它就可以做注釋所暗示的除法了。


這種模棱兩可的寫法在其他環(huán)境中就會引起麻煩。例如,老版本的C使用=+表示現(xiàn)在版本中的+=。這樣的編譯器會將


a=-1;


視為


a =- 1;



a = a - 1;


這會讓打算寫


a = -1;


的程序員感到吃驚。


另一方面,這種老版本的C編譯器會將


a=/*b;


斷句為


a =/ *b;


盡管/*看起來像一個注釋。


1.4 例外

組合賦值運(yùn)算符如+=實(shí)際上是兩個記號。因此,


a + /* strange */ = 1



a += 1


是一個意思?雌饋硐褚粋單獨(dú)的記號而實(shí)際上是多個記號的只有這一個特例。特別地,


p - > a


是不合法的。它和


p -> a


不是同義詞。


另一方面,有些老式編譯器還是將=+視為一個單獨(dú)的記號并且和+=是同義詞。


1.5 字符串和字符

單引號和雙引號在C中的意義完全不同,在一些混亂的上下文中它們會導(dǎo)致奇怪的結(jié)果而不是錯誤消息。


包圍在單引號中的一個字符只是書寫整數(shù)的另一種方法。這個整數(shù)是給定的字符在實(shí)現(xiàn)的對照序列中的一個對應(yīng)的值。因此,在一個ASCII實(shí)現(xiàn)中,'a'和0141或97表示完全相同的東西。而一個包圍在雙引號中的字符串,只是書寫一個有雙引號之間的字符和一個附加的二進(jìn)制值為零的字符所初始化的一個無名數(shù)組的指針的一種簡短方法。


線面的兩個程序片斷是等價的:


printf("Hello world\n");


char hello[] = {
'H', 'e', 'l', 'l', 'o', ' ',
'w', 'o', 'r', 'l', 'd', '\n', 0
};
printf(hello);


使用一個指針來代替一個整數(shù)通常會得到一個警告消息(反之亦然),使用雙引號來代替單引號也會得到一個警告消息(反之亦然)。但對于不檢查參數(shù)類型的編譯器卻除外。因此,用


printf('\n');


來代替


printf("\n");


通常會在運(yùn)行時得到奇怪的結(jié)果。


由于一個整數(shù)通常足夠大,以至于能夠放下多個字符,一些C編譯器允許在一個字符常量中存放多個字符。這意味著用'yes'代替"yes"將不會被發(fā)現(xiàn)。后者意味著“分別包含y、e、s和一個空字符的四個連續(xù)存貯器區(qū)域中的第一個的地址”,而前者意味著“在一些實(shí)現(xiàn)定義的樣式中表示由字符y、e、s聯(lián)合構(gòu)成的一個整數(shù)”。這兩者之間的任何一致性都純屬巧合

共1 條記錄, 每頁顯示 10 條, 頁簽: [1]

Copyright © 2000 - 2009 曙海教育集團(tuán)
Powered By 曙海教育集團(tuán) Version 2.2
Processed in .01563 s, 2 queries.
久久精品在这里_成人99免费视频_国产激情视频一区二区在线观看_国产伦精品一区二区三区免费 _亚洲午夜免费福利视频_色狠狠色狠狠综合_av在线综合网_91毛片在线观看_欧美视频一区二区在线观看_极品美女销魂一区二区三区免费_国产亚洲欧美激情_在线免费观看不卡av_日韩不卡一区二区三区_91精品国产麻豆国产自产在线_亚洲国产精品一区二区久久恐怖片_a4yy欧美一区二区三区
久久亚洲一级片| 欧美日韩国产天堂| 一区二区三区中文字幕精品精品 | 成人精品国产一区二区4080 | 欧美日韩国产高清一区| 成人av动漫在线| ㊣最新国产の精品bt伙计久久| 色综合天天综合色综合av | 日韩福利视频网| 欧美日韩精品免费观看视频 | 成人永久看片免费视频天堂| 中文成人综合网| 色综合久久综合网欧美综合网| 国产成人8x视频一区二区| 国产精品久久久久三级| 91久久人澡人人添人人爽欧美| 成a人片国产精品| 亚洲精品视频免费看| 欧美老肥妇做.爰bbww| 精品国产乱码一区二区三区四区| 裸体一区二区三区| 中文在线一区二区| 在线免费观看日本欧美| 成人av片网址| 久久国产尿小便嘘嘘尿| 国产精品对白交换视频| 欧美裸体一区二区三区| 久久99精品久久久久久秒播放器 | 亚洲v国产v在线观看| 成人一区二区在线观看| 亚洲一区精品在线| 日韩精品一区二| 亚洲一区二区三区精品在线观看| 99热在这里有精品免费| 日韩主播视频在线| 欧美国产日韩a欧美在线观看| 色屁屁一区二区| 国产一区不卡在线观看| 国产精品白丝av| 亚洲国产精品一区二区久久| 精品国精品国产| 中文字幕欧美人与畜| 国产精品欧美久久| 国产精品亚洲第一区在线暖暖韩国| 一区二区三区国产精华| 国产亚洲精久久久久久| 欧美剧情片在线观看| 亚洲aⅴ天堂av在线电影软件| 91网页版在线| 日本欧美大码aⅴ在线播放| 国产精品理伦片| 欧美xxxxx裸体时装秀| 色8久久精品久久久久久蜜| 精品视频一区二区| caoporn国产精品| 另类的小说在线视频另类成人小视频在线| 亚洲天堂福利av| 久久久亚洲综合| 日韩一区二区三区观看| 色美美综合视频| 欧美视频1区| 国产精品亲子伦对白| 欧美va亚洲va在线观看蝴蝶网| 欧美无人高清视频在线观看| 先锋影音一区二区三区| 国产一区在线免费| 99精品一区二区三区| 国产福利一区二区三区| 精品一区二区综合| 日韩影视精彩在线| 亚洲国产精品久久久久婷婷884 | 精品国产亚洲一区二区三区在线观看 | 青青国产91久久久久久| 一区二区三区在线视频观看58| 日本一区二区免费在线观看视频 | 久久亚洲综合色| 欧美挠脚心视频网站| 一本一生久久a久久精品综合蜜| 极品校花啪啪激情久久| 国产91社区| 91麻豆自制传媒国产之光| 成人精品国产一区二区4080| 国产美女视频91| 国产精品久久久久一区二区三区 | 国产乱码精品一品二品| 久久99精品国产91久久来源| 亚洲国产美国国产综合一区二区| 国产精品国产三级国产a| 国产欧美久久久精品影院| 久久免费精品国产久精品久久久久| 日韩一区二区免费高清| 欧美人狂配大交3d怪物一区| 欧美三级日本三级少妇99| 色天天综合色天天久久| 亚洲一区二区三区欧美| 色噜噜狠狠一区二区三区| 欧美一区二区三区在线免费观看| 精品一区二区三区日本| 欧美日韩亚洲免费| 日本精品视频一区| 欧美综合激情| 亚欧洲精品在线视频免费观看| 亚洲欧美电影在线观看| 一区二区三区四区| 在线中文字幕不卡| 欧美日韩综合在线| 7777精品伊人久久久大香线蕉的 | 日韩理论片网站| 亚洲裸体xxx| 亚洲成人免费av| 午夜成人在线视频| 久久99久久99小草精品免视看| 国产专区综合网| 亚洲综合成人在线视频| 亚洲国产精品综合小说图片区| 日韩二区三区四区| 精品无码三级在线观看视频| 国产不卡高清在线观看视频| 99riav久久精品riav| 国产亚洲福利社区| 五码日韩精品一区二区三区视频| 中文字幕成人一区| 欧美精品xxxxbbbb| 久久综合给合久久狠狠狠97色69| 国产精品成人免费| 午夜精品123| 国产二区国产一区在线观看| 51精品国产人成在线观看| 久久99精品久久久久久三级 | 91精品欧美久久久久久动漫 | 色婷婷精品久久二区二区蜜臂av| 欧美精品在线观看一区二区| 精品国产不卡一区二区三区| 亚洲人亚洲人成电影网站色| 日韩精品电影一区亚洲| 风流少妇一区二区| 好吊妞www.84com只有这里才有精品 | 久久久99精品免费观看不卡| 亚洲欧洲一区二区三区| 视频在线观看国产精品| 国产suv精品一区二区三区| 国产精华一区| 色综合久久综合| 欧美精品一区二| 亚洲影视在线播放| 国产真实精品久久二三区| 国产99在线免费| 色婷婷精品大在线视频| 久久午夜国产精品| 亚洲成a人片在线不卡一二三区| 国产精品白丝jk白祙喷水网站| 精品久久一区二区三区蜜桃| 色综合久久综合中文综合网| 精品国产一区二区三区久久影院| 亚洲精品日韩综合观看成人91| 狠狠色综合日日| 久久99久久99精品蜜柚传媒| 欧美日韩国产一区| 最新不卡av在线| 激情偷乱视频一区二区三区| 国产精品视频在线免费观看| 欧美最猛性xxxxx直播| 欧美激情一区二区三区不卡| 免费人成在线不卡| 国产精品亚洲综合| 欧美性受极品xxxx喷水| 国产精品乱码人人做人人爱| 精品一区二区三区免费| 久久精品日产第一区二区三区乱码| 欧美色视频一区| 最新热久久免费视频| 国产91在线看| 亚洲图片欧洲图片日韩av| 国产欧美日韩在线| 日本午夜精品一区二区三区电影| 成人自拍视频网站| 欧美日韩在线播放一区| 亚洲男人天堂av网| 盗摄精品av一区二区三区| 日韩免费中文专区| 久久综合五月天婷婷伊人| 日本亚洲免费观看| 久久精品国产99精品国产亚洲性色| 欧美日韩成人一区二区| 一区二区三区在线视频免费 | 亚洲看片网站| 国产欧美一区二区精品婷婷| 激情图片小说一区| 特级西西444www大精品视频| 久久久久久久久久久久久夜| 激情综合网最新| 亚洲日本理论电影| 国产精品不卡视频| www.亚洲在线| 欧美日韩在线不卡| 亚洲国产精品久久久久婷婷884 | 国产成人精品www牛牛影视| 色综合色狠狠天天综合色| 国产精品国产三级国产a| 丁香啪啪综合成人亚洲小说 |