相信很多朋友在學(xué)習(xí)C語言過程中,都看到過EOF的字樣,但翻過整本C語言的書,也沒有看到有這個(gè)函數(shù)或者關(guān)鍵字的,豈不是感覺很奇怪?難道學(xué)的不細(xì)有疏漏嗎?當(dāng)然不是!這里筆者告訴您一個(gè)技巧,如果您在看代碼過程中,看到特殊的字符感覺不是關(guān)鍵字也不是函數(shù),那您首先要想到的就是:這個(gè)東西是不是#define或者typedef過的呢?
直接開門見山,比如ACM比賽經(jīng)常有這樣的代碼:while(scanf(“%d%d”)!=EOF)
這玩意啥意思呢?首先scanf你寫while里就很奇怪了,初學(xué)者表示沒見過這么嵌套寫的,再加個(gè)EOF更離譜了,都讓人懷疑這是不是C代碼了……
那給大家講一下,首先這個(gè)代碼scanf能寫while里是因?yàn)閟canf(“%d%d”)!=EOF本身是個(gè)邏輯判斷,也就是真或者假,所以可以作為條件判斷寫到while里,那么最主要的問題來了,EOF到底啥玩意?
好了,如果您學(xué)了C語言中的宏定義就一切真相大白了,您不妨打開我們最常用的stdio.h這個(gè)頭文件(不知道怎么打開?隨便打開一個(gè)包含這個(gè)頭文件的程序,右鍵即可),然后搜索EOF即可發(fā)現(xiàn)答案! 如下:
怎么樣?看到了吧,EOF其實(shí)就是-1!
也就是說EOF就是個(gè)數(shù)字,被定義為-1而已!
為什么這樣做呢? stdio.h作為一個(gè)標(biāo)準(zhǔn)輸入輸出的頭文件,自然會(huì)定義很多標(biāo)準(zhǔn)的東西,那么EOF正是因此而生,且聽筆者慢慢道來:
在我們進(jìn)行包括scanf等的輸入函數(shù)使用時(shí),其實(shí)用戶在cmd中的輸入實(shí)際是存放于緩沖區(qū)當(dāng)中,當(dāng)用戶鍵入回車那一瞬間,之前輸入的數(shù)據(jù)才會(huì)被存進(jìn)去,而這里無論是單個(gè)字符還是字符串,我們都知道scanf的返回值呢是表示成功接受到的對(duì)象的個(gè)數(shù),那這里如果遇到特殊情況,比如緩沖區(qū)文件流滿等問題,那么scanf將如何處理呢?答案是返回-1 ! 這里不光是scanf,返回值為個(gè)數(shù)的函數(shù),遇到文件流滿大多都會(huì)返回-1,所以這個(gè)-1用的比較多,那么stdio.h就索性專門定義一個(gè)宏來表示,取End Of File(文件末尾的意思)的前三個(gè)字母即組成EOF,所以也就有了 #define EOF (-1) 這樣的話!
那么,現(xiàn)在看懂了嗎?
C語言研究中心(www.sztianhecheng.cn)