C語言學習趣事_BT_C_Code_混亂編程程式碼分析_3

來源:互聯網
上載者:User

      好久沒有看C的書籍了,前兩天在CSDN求助,求各位大神們能介紹一本書,我求助的要求是這樣的:求一本介紹Windows C語言執行階段程式庫的書籍。

書的內容要求是:能夠具體介紹C語言庫函數的實現方法,例如printf這樣的函數,或者fopen這樣的函數是如何?的。結果很多大俠沒有明白我的意思,

給我介紹的都是非常經典的書籍: 《Windows程式設計》、《Windows核心編程》這樣的書籍,在此對那些回複的大俠表示感謝。 不知道園子裡的大俠

有沒有人知道這方面的書籍,有的話請不吝指教,在此先謝過了。

    我前些天偶然看到了部分Windows下的C語言庫函數的原始碼,先貼出來一段printf的代碼給大家看看,原始碼的所有權歸Microsoft所有,在此我僅僅是

為了貼出來供大家鑒賞,看看原來printf函數可以有多簡單。

/****printf.c - print formatted**       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.**Purpose:*       defines printf() - print formatted data********************************************************************************/#include <cruntime.h>#include <stdio.h>#include <dbgint.h>#include <stdarg.h>#include <file2.h>#include <internal.h>#include <mtdll.h>/****int printf(format, ...) - print formatted data**Purpose:*       Prints formatted data on stdout using the format string to*       format data and getting as many arguments as called for*       Uses temporary buffering to improve efficiency.*       _output does the real work here**Entry:*       char *format - format string to control data format/number of arguments*       followed by list of arguments, number and type controlled by*       format string**Exit:*       returns number of characters printed**Exceptions:********************************************************************************/int __cdecl printf (        const char *format,        ...        )/* * stdout 'PRINT', 'F'ormatted */{        va_list arglist;        int buffing;        int retval;        va_start(arglist, format);        _ASSERTE(format != NULL);        _lock_str2(1, stdout);        buffing = _stbuf(stdout);        retval = _output(stdout,format,arglist);        _ftbuf(buffing, stdout);        _unlock_str2(1, stdout);        return(retval);}

     我第一次看Windows下微軟的代碼,不得不對微軟的人說聲:原來大神的人物就是這樣的。首先這段代碼非常精簡,其次風格非常好,與我接下來

要分析的一段代碼簡直就是天壤之別。我曾經在一段時間受Linux陣營的人的影響,一直覺得微軟的Windows不好,甚至一度將windows從自己的計

算機上卸載,後來因為各種原因又回來了(主要是Step 7/RSLogix等工控軟體不支援Linux,現在我發現自己以前的看法絕對有失偏頗,現在想想其實

微軟對整個電腦的推動作用還是非常大的,好了這裡不多說了。下面來看看今天的代碼:

int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}

    這段代碼的作用是輸出: hello, world!

   分析代碼還是按照原來的套路進行,第一步進行縮排,得到如下代碼:

int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\o, world!\n",'/'/'/')) ;}read(j,i,p){write(j/p+p,i---j,i/i);}

   接下來補全部分代碼定義,很顯然上面的代碼是按照K&R規範編製的,很多文法在ANSI C標準裡面是不成立的。

#include <stdio.h>int i;int main(int argc,char **argv){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\o, world!\n",'/'/'/')) ;  return 0;}int read(int j, int i, int p){write(j/p+p,i---j,i/i);}

  補全代碼後這段代碼需要說明的幾個問題是:

   1、   i[str] 在解析的時候 ==>  str[i] ;  其中 str是一個字串字面值。

   2、   字串字面值實際返回的是一個指標, 即 “str” 的傳回值類型是 char  *

   3、   '-'-'-'  這個運算式實際上==>    ( '-' ) -  ('-') ; 即表達是的傳回值為 0 。

   4、   '/'/'/'  這個運算式實際上==>     ( '/' ) / ( '/' ) ; 即運算式的傳回值是 1 。

   5、 最後一個需要說明的是write函數, 這個函數的用法我也不知道,但是可以google或者百度之,這裡摘錄一下百度百科的解釋:

int write(int handel, void *buf, int nbyte);   handel 是檔案描述符;   buf是你指定的緩衝區,即指標,指向一段記憶體單元;   nbyte是你要寫入檔案指定的位元組數;   傳回值:寫入文檔的位元組數(成功);-1(出錯)

     這裡就涉及到 stdout 的定義,這個宏定義的值是多大估計不需要再說了。還有就是按照unix處理裝置的方式:一切皆檔案。(沒有人定義過,我自己的理解)。

就和物件導向一樣:一切皆對象。

     6、 這裡還有一個需要說明的問題:

           i+++"hell\o, world!\n" 

  和  

           i---j;

      這個地方的解析牽扯到C語言編譯解析過程的貪進法,具體的內容有興趣的可以看看編譯原理相關的書,我是不懂的,園子裡腦袋大俠的文章寫得不錯,對編譯

器有深入的討論,因此 +++ 和 ---在解析的時候會解釋成(運算元++)+ 和 (運算元——)- 。

  對於第6個問題,在chinaunix論壇裡面 pmerofc 大俠說這樣的運算式不正確,我一直不明白,也不好意思請教, 原文的連結我忘記了,是一個女生自己寫的博文,

然後說這樣有點問題,連結我也忘記了。不知道園子裡的大俠能否解釋一二。

   

     心裡有點煩,非常的煩,寫了這麼多,為一些事情而煩惱......................

    曾經有人大代表說不支援農村孩子上大學,很多人反對,其實有些事情,還要辯證的看,我自己覺得就還是有點道理的(為了不被誤會,說明一點我自己就是農村的)

從我自己的經曆來看,還是值得思考的問題。

   這裡問個比較私人的問題: 不知道園子裡garbageman大俠是否就是 chinaunix裡面的pmerofc大俠,因為我搜尋pmerofc大俠,看到他有文章連結是《C解毒》。

   如果是的話,請garbageMan大俠回複一句,在此先表示感謝。

    算了不說了, 準備睡覺........

 



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.