不知道什麼原因,基本上所有的C語言入門書籍的第一個C語言實體,都是“Hello Word!”;我不知道這是不是行業的“潛規則”, 就像某些行業的潛規則一樣,不過這個都不重要了,重要的是就是“她”把無數的程式員帶進了電腦的世界;不管是合格的程式員,還是不合格的程式員(就像我似的)。
說來也奇怪,就那麼些簡單的字元經過不知道什麼物理變化還是化學變化後,居然就能在電腦上顯示出"Hello Word!"。
我記得我第一次摸電腦時,不知道怎麼開機, 當然以為關機就像關電視一樣......哈哈,到目前為止我還經常關電腦就像關電視機一樣(當然這是在電腦當機之後);記得第一看電腦基礎的時候, 說要在電腦上安裝軟體, 我以為就像在牆上安裝電燈一樣,需要把電腦的殼子開啟,然後再把要安裝的軟體用螺絲擰到機殼上就完事了................
下面進入本次瞎掰的主題:
#include <stdio.h>
int main(int argc,char **argv)
{
printf("Hello Word!");
}
我至目前為止還不明白這些字母是怎麼把字元顯示到電腦螢幕上的,不知道這些字元是怎麼驅動電子怎麼運動的, 反正我在學校的時候知道如果用與非門的電子器件是可以驅動LED指示燈顯示出一些資訊的,就像目前流行的LED顯示屏一樣, 哈哈哈.....................實在是慚愧。
幾乎所有的C語言教材,都會明確的指出,printf();這個不是C語言定義的基本組成元素,而是由系統或者編譯器供應商提供的一個應用介面。一般其函數原型應該是這樣的:
int printf(const char *,...);
這裡有個問題,我們學習函數定義的時候,教材應該是這樣說的:
函數修飾符 函數傳回值類型 函數標識符(函數參數列表)
Exp:
stdcall int max(int x,int y);
就是函數形式參數在聲明函數原型的時候必須指定函數參數的資料類型, 即: 函數修飾符 函數傳回值類型 函數標識符(參數類型1,參數類型2);
但是我們的printf()函數的參數列表裡面有一個: ... ; 那麼在函數的參數列表裡面具有(...) 是什麼意思呢?
我上學的時候老師推薦的是譚的書,可以我從頭翻到尾,又從尾部翻到頭, 都沒有發現怎麼解釋這個問題, 難怪有些人會在一些地方大罵譚的書不怎麼樣,想想還真不是空穴來風(這裡說這個,完全沒有任何別的意思,只是想說明,中國的教育界,真的很..............). 為了弄明白這個問題我苦苦的等了六年,整整六年(大一學C,畢業兩年了);
在那本經典的書裡面有這麼一段話:
標頭檔<stdagr.h>提供了遍曆未知數目和類型的函數表的功能。
假設函數F帶有可變數目的實參,lastarg是他的最後一個命名的形式參數,那麼在函數F內聲明一個類型為va_list的變數ap,它將依次指向每個實際參數:
Exp: va_list ap;
在訪問任何未命名的參數前,都必須用va_start宏初始化ap一次:
Exp: va_start(va_list ap,lastarg);
此後每執行宏va_arg都將產生一個與下一個未命名的參數具有相同類型和數值的值,它同時還修改ap; 以使得下一次執行宏va_arg是返回下一個參數:
Exp: type va_arg(va_list ap,type )
在所有的參數處理完畢後,且在退出F函數之前,必須調用一次va_end宏一次,如下所示:
Exp: void va_end(va_list ap);
下面我們簡單的看看這個宏怎麼使用:
我們模仿一個printf函數的實現:
unsigned int myprintf(const char *format,...)
{
va_list varg;
char *p,
chSave;
int iGetInPut;
double fGetInput;
va_start(varg,format); // 初始化參數
for(p=format;*p;P++)
{
if('%' != *p)
{
putchar(*p);
continue;
}
switch(*(p++) )
{
case d:
iGetInput=va_list(ap,int);
printf("%d",iGetInput);
break;
case f:
fGetInPut=va_list(ap,float);
printf("%f",fGetInPut);
break;
case s:
chGetInPut=va_list(ap,char);
putchar(chGetInPut);
break;
default:
putchar(*p);
break;
}
}
va_end(varg);
}
哈哈, 模仿的一個程式...............
至於怎麼實現這個varg,那決定於系統和開發的編譯器...............
為了實現變參數,需要進行判斷..............判斷每一個輸入不定參數的類型............