久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      從C#到C語言

       

        學(xué)一門語言,最好的辦法就先系統(tǒng)的看一遍教程,然后多多動手實(shí)踐,我們拿字符串提取信息的題目開始學(xué)習(xí),題目要求如下:

        現(xiàn)在我們參考c#的實(shí)現(xiàn),再用C語言來實(shí)現(xiàn)一個(gè),因?yàn)镃語言和C#有很多區(qū)別,而我們比較熟悉c#語言,所以我們可以對比著來學(xué)習(xí)。首先要說的是c和c++ 是兩門不同的語言,雖然c++編譯器能編譯c代碼。下面的介紹中也會提到一些c和c++的區(qū)別。精通C語言不是特別難,如果要精通c++很難,C++的細(xì)節(jié)太多了。

        c#有using語句用來引入一個(gè)命名空間,本文件就可以使用該命名空間下的類了,c語言里沒有命名空間的概念,如果要使用C函數(shù)庫里的函數(shù)的話,使用#include語句來把那個(gè)頭文件包含進(jìn)來就可以使用了,如下

        #include

        但c++里就可以使用using來引入命名空間,比如

        雙擊代碼全選 1 using namespace std;

       

        類庫

       

        .net開發(fā)有。net framework,c沒有這么強(qiáng)大的類庫,但c也有一些標(biāo)準(zhǔn)的函數(shù)庫,比如stdio.h里定義了輸入輸出的一些函數(shù),stdlib.h定義了一些內(nèi)存分配,類型轉(zhuǎn)換等函數(shù),math.h里定義了一下數(shù)學(xué)相關(guān)的函數(shù)。

        注意不要把c標(biāo)準(zhǔn)函數(shù)庫和c++標(biāo)準(zhǔn)程序庫混淆了,c++標(biāo)準(zhǔn)程序庫比c標(biāo)準(zhǔn)函數(shù)庫強(qiáng)大多了,增強(qiáng)了字符串相關(guān)的類,還有一些數(shù)據(jù)結(jié)構(gòu),異常處理方面的類。另外還有個(gè)c++標(biāo)準(zhǔn)模板庫,就是STL,這個(gè)大概相當(dāng)于。NET里System.Collections.Generic下的類,主要是有一些通用的容器的數(shù)據(jù)結(jié)構(gòu)和用于查詢數(shù)據(jù)的定位器,c語言只能用第一個(gè),c標(biāo)準(zhǔn)函數(shù)庫,另外兩個(gè)都不能用。

       

        宏,枚舉和常量

       

        c 語言里可以用#define宏和enum類型來定義常量,在程序中沒有地方存它的值,在編譯的時(shí)候就分配好內(nèi)存了;而用const修飾的變量叫只讀變量,需要在內(nèi)存里開辟一個(gè)地方保存它的值,由編譯器來標(biāo)識它不可以修改。在c#里const和readonly關(guān)鍵字定義了編譯時(shí)常量和運(yùn)行時(shí)常量,這兩種常量在使用上也有一些不同,比如a程序集定義了一個(gè)const常量,b程序集引用a程序集,a的const常量修改了后,b程序集要重新編譯才能使修改生效,而如果a程序集里是用readonly定義的常量,b就不用重新編譯。如下,定義了一個(gè)常量和3個(gè)只讀變量

        雙擊代碼全選 1234 #define MAX_TOKEN_LEN 20 const e_arg_invalid = -1; const e_token_overfllow = -2; const s_ok = 0;

        注意#define語句后面沒有分號,關(guān)于常量和只讀變量的更多的細(xì)節(jié)上的區(qū)別,見下面的鏈接

        C語言程序設(shè)計(jì)之正確使用const

        CLR Via C# 學(xué)習(xí)筆記- 常量和字段(const readonly)

       

        函數(shù)原型定義

       

        在 c#里,一個(gè)文件里一個(gè)函數(shù)無論定義在哪里,另一個(gè)函數(shù)都可以直接使用,但C語言里,一個(gè)函數(shù)的定義必須在它的使用之前,如果一個(gè)函數(shù)的定義在較靠后的地方,而上面有個(gè)函數(shù)要調(diào)用這個(gè)函數(shù),就需要把被調(diào)用的這個(gè)函數(shù)在文件比較靠上的部分進(jìn)行原型定義。原型定義就是把這個(gè)函數(shù)的簽名寫出來,表示下面會有這么一個(gè)函數(shù),一般函數(shù)定義寫在頭文件里。如下就是對字符串狀態(tài)解析用的5個(gè)函數(shù)的原型定義。

       

        如何寫出專業(yè)的C頭文件

       

        函數(shù)指針

        c# 里的委托咱們都十分的熟悉,它指向一個(gè)方法鏈,執(zhí)行它的話,這一串兒方法都會執(zhí)行。在c里沒有委托的概念,但有函數(shù)指針的概念,函數(shù)指針可以指向一個(gè)函數(shù),調(diào)用這個(gè)函數(shù)指針,真正的方法也會調(diào)用(但會訪問兩次內(nèi)存,效率比直接調(diào)用低),可如下c#代碼如何用c來表示呢?

        delegate StateParser StateParser(char ch);

        StateParser這個(gè)委托的參數(shù)是char類型,但返回值又是它本身的類型,c語言雖然支持返回函數(shù)指針的函數(shù),卻不支持這種循環(huán)定義,所以我們需要一個(gè)無類型的指針void*來定義這個(gè)函數(shù)指針的返回值,然后再必要的時(shí)候進(jìn)行類型轉(zhuǎn)換,如下。

        雙擊代碼全選 1 typedef void* (*fn_parse)(char c);

        該語句定義了名為fn_parse的函數(shù)指針,它需要一個(gè)char類型的參數(shù),并返回void*類型。

        本篇帖子的目的是為了學(xué)習(xí)c語言,其實(shí)這個(gè)題目用狀態(tài)機(jī)來解,直接用幾個(gè)狀態(tài)處理函數(shù)之間相互調(diào)用就行,不定義StateParser這個(gè)委托就行,但現(xiàn)在我們來完全模仿老趙的c#實(shí)現(xiàn)。

       

        LINQ

        呵呵,C語言當(dāng)然不會有LINQ了,更不會有string的Aggregate方法了,所以我們要自己實(shí)現(xiàn)一個(gè)aggregate方法,該方法需要兩個(gè)參數(shù),第一個(gè)參數(shù)是fn_parse類型的函數(shù)指針,第二個(gè)參數(shù)是一個(gè)字符串,遍歷這個(gè)字符串,分別用每個(gè)字符作為參數(shù)去調(diào)用parse函數(shù)指針,并把其返回值也轉(zhuǎn)換成fn_parse類型,然后用它去處理下一個(gè)參數(shù)。

       

        代碼

        雙擊代碼全選 1234567891011 void aggregate(fn_parse parse, const char* input){

        while(*input != ”){

        if(last_error == s_ok){

        parse = (fn_parse)(*parse)(*input);

        input++;

        }else{

        printf(“ocurr an error:%d”, last_error);

        break;

        }

        } }

       

        看下面這句

        雙擊代碼全選 1 parse = (fn_parse)(*parse)(*input);

        *用在一個(gè)指針的前面的時(shí)候是表示取值,*parse是取出函數(shù)指針parse所指向的函數(shù),前面的(fn_parse)把返回的函數(shù)的地址void*轉(zhuǎn)換成fn_parse類型,*input是取出input指針?biāo)赶虻淖址?/span>

       

        LinQ方法之———Aggregate

       

        異常處理

        c#里異常處理可以用try語句來實(shí)現(xiàn)結(jié)構(gòu)化異常處理,在c里一般用返回碼來做異常處理,我們先聲明了一個(gè)全局變量last_error表示最后一次出現(xiàn)異常的錯(cuò)誤碼,然后定義了幾個(gè)只讀變量來表示可能的錯(cuò)誤碼,如下。

        雙擊代碼全選 1234 const e_arg_invalid = -1; /* 錯(cuò)誤的參數(shù)*/const e_token_overfllow = -2;/* 數(shù)組溢出 */const s_ok = 0; int last_error = 0;

        c 里只支持/**/括住的注釋,c++里支持//格式的注釋,我們在每調(diào)用一次函數(shù)之后,要判斷l(xiāng)ast_error是否為s_ok,如果不是,說明函數(shù)執(zhí)行出錯(cuò)了,上面的aggregate里就用了這樣的異常處理機(jī)制。在函數(shù)的定義里,應(yīng)該在函數(shù)的開始把last_error設(shè)置為s_ok,出錯(cuò)的時(shí)候設(shè)置為相應(yīng)的錯(cuò)誤碼。

       

        字符串

        c#的字符串很強(qiáng)大,String類型有很多方法,而且。net 3.5又加了一些擴(kuò)展方法,使用起來非常方面,c里就沒這么方便了,c里的字符串是char的數(shù)組,并以結(jié)束??梢杂胏har[]來表示,因?yàn)閿?shù)組可以用指針表示,所以也可以用char*來表示。然后有一些庫函數(shù)可以操作字符串,但都比較簡單。c++里定義了string類型,以及支持多字節(jié)編碼的 wchar_t等類型,c/c++里的字符串由于歷史原因有很多細(xì)節(jié)的問題,具體看下面的兩個(gè)鏈接。

       

        輸入輸出

        c#里有Console.Write和Console.Read兩個(gè)方法進(jìn)行輸入輸出,在c里有printf和scanf,這兩個(gè)函數(shù)可以進(jìn)行格式化輸出和輸入,常用的%d表示int,%c表示字符,%s表示字符串。

       

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號