第八~十三章

第八~十三章

第八章

  • 考慮下面的數(shù)組聲明:

    int a[] = {4, 9, 1, 8, [0]=5, 7};
    

    編譯器在處理初始化式列表時(shí),會(huì)記錄下一個(gè)待初始化的數(shù)組元素位置。正常情況下,下一個(gè)元素是剛被初始化元素后面的那個(gè)。但是當(dāng)列表中出現(xiàn)初始化式時(shí),下一個(gè)元素會(huì)被強(qiáng)制為指示符對(duì)應(yīng)的元素,即使該元素已經(jīng)被初始化過(guò)了。

    所以最終效果與下面的聲明一樣:

    int a[] = {5, 7, 1, 8};
    

第九章

  • 函數(shù)定義
    • 如果省略返回類型,C89假定為int類型,在C99中是非法的。
  • 函數(shù)聲明
    • 函數(shù)聲明可以放在另一個(gè)函數(shù)體內(nèi)
  • C99中在調(diào)用一個(gè)函數(shù)之前,必須先對(duì)其進(jìn)行聲明或定義
  • 變長(zhǎng)數(shù)組的形參
    • 一維

      int sum_array(int a[], int n);
      int sum_array(int n, int a[n]);
      int sum_array(int n, int a[*]);
      int sum_array(int, int [*]);
      int sum_array(int, int []);
      int sum_array(int n, int a[]);
      
    • 二維

      int sum_two_dimensional_array(int n, int m, int a[n][m]);
      int sum_two_dimensional_array(int n, int m, int a[*][*]);
      int sum_two_dimensional_array(int n, int m, int a[][m]);
      int sum_two_dimensional_array(int n, int m, int a[][*]);
      
  • 數(shù)組參數(shù)聲明中使用static
    • 下例中,將static放在數(shù)字3之前表明數(shù)組長(zhǎng)度至少可以保證是3

      int sum_array(int a[static 3], int n)

    • 如果數(shù)組是多維的,static僅可用于第一維

  • 復(fù)合字面量
    • 復(fù)合字面量是通過(guò)指定其包含的元素而創(chuàng)建的沒(méi)有名字的數(shù)組
    • 格式:先在一堆圓括號(hào)內(nèi)給定類型名,隨后在一對(duì)花括號(hào)內(nèi)設(shè)定所包含元素的值

第十二章

表達(dá)式 含義
*p++*(p++) 自增前表達(dá)式值是*p,以后再自增p
(*p)++ 自增前表達(dá)式值是*p,以后再自增p
*++p*(++p) 先自增p,自增后表達(dá)式的值是*p
++*p++(*p) 先自增*p,自增后表達(dá)式的值是*p

第十三章

  • strlen的精簡(jiǎn)史

    size_t strlen(const char *s) {
        size_t n;
        for (n = 0; *s != '\0'; s++) {
            n++;
        }
        return n;
    }
    

    n的初始化移到聲明,*s != '\0'*s != 0是一樣的,測(cè)試*s != 0*s是一樣的

    size_t strlen(const char *s) {
        size_t n = 0;
        for (; *s; s++) {
            n++;
        }
        return n;
    }
    

    同一個(gè)表達(dá)式中對(duì)s進(jìn)行自增,并測(cè)試*s是可行的

    size_t strlen(const char *s) {
        size_t n = 0;
        for (; *s++;) {
            n++;
        }
        return n;
    }
    

    while語(yǔ)句替換for語(yǔ)句

    size_t strlen(const char *s) {
        size_t n = 0;
        while (*s++) {
            n++;
        }
        return n;
    }
    

    看起來(lái)精簡(jiǎn)很多,但事實(shí)上速度根本沒(méi)提升,至少對(duì)于一些編譯器下面的版本確實(shí)會(huì)快一點(diǎn)

    size_t strlen(const char *s) {
        const char *p = s;
        while (*s++) 
            ;
        return s - p;
    }
    

    速度的提升得益于不需要在while循環(huán)中對(duì)n進(jìn)行自增

  • 搜索字符串結(jié)尾

    while (*s++) 
        ;
    
    while (*s) 
        *s++;
    

    注意兩個(gè)版本結(jié)束時(shí)s指向的位置

  • 字符串復(fù)制

    while (*s++ = *p++) 
        ;
    

    循環(huán)在賦值空字符后停止,不需要單獨(dú)添加空字符

  • C89規(guī)定,編譯器必須最少支持509個(gè)字符長(zhǎng)的字符串字面量(沒(méi)錯(cuò),就是509,不要懷疑);C99是4095個(gè)字符

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容