欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

讀書(shū)筆記-C語(yǔ)言關(guān)鍵字-創(chuàng)新互聯(lián)

001 關(guān)鍵字

  • C語(yǔ)言一共32個(gè)關(guān)鍵字

    1. 聲明和定義

  • 在開(kāi)始認(rèn)識(shí)關(guān)鍵字前,必須要明白什么是聲明,什么事定義:
    • 定義:(編譯器)創(chuàng)建一個(gè)對(duì)象,為這個(gè)對(duì)象分配一段內(nèi)存并給他取上一個(gè)名字。在一個(gè)作用域內(nèi),一個(gè)變量或者對(duì)象只能定義一次,并且定以后為它分配的內(nèi)存不可變;
    • 聲明:1、告訴編譯器這個(gè)名字已經(jīng)和一片內(nèi)存匹配上了,并且這個(gè)內(nèi)存是在其他地方定義的,聲明可以多次;2、告訴編譯器,這個(gè)名字已經(jīng)占用,不能再用來(lái)定義其他變量或者對(duì)象了。
  • 備注:定義創(chuàng)建了對(duì)象,并為它分配了內(nèi)存,聲明沒(méi)有分配內(nèi)存

2. 關(guān)鍵字

2.1. auto(最寬宏大量的關(guān)鍵字)

  • 在默認(rèn)情況下,編譯器默認(rèn)所有變量都是auto的,所以我們可以當(dāng)它不存在。

2.2. register(最快的關(guān)鍵字)

  • 請(qǐng)求編譯器,盡可能的把使用register定義的變量發(fā)到CPU的寄存器中,不保證一定放。(CPU的寄存器有限)
  • 注意:register變量長(zhǎng)度應(yīng)該小于等于int,并且不能使用&(register變量不存放在內(nèi)存中)

2.3. static (最名不符實(shí)的關(guān)鍵字)

  • 修飾變量
    • 修飾全局變量,從定義開(kāi)始到文件結(jié)束可用,其他文件即使使用extern 也不能使用
    • 修飾局部變量,只能在函數(shù)體里面使用
    • 由于被static修飾的變量都是存放在內(nèi)存的靜態(tài)區(qū),所以即使函數(shù)運(yùn)行結(jié)束,這個(gè)變量也不會(huì)被銷(xiāo)毀,函數(shù)下次使用時(shí)任然能用到這個(gè)值。
  • 修飾函數(shù)
    • 函數(shù)使用static修飾表示作用域僅限于本文件,又稱(chēng)內(nèi)部函數(shù)

2.4. short、int、long、char、float、double(基本數(shù)據(jù)類(lèi)型)

讀書(shū)筆記-C語(yǔ)言關(guān)鍵字

成都創(chuàng)新互聯(lián)是一家專(zhuān)業(yè)提供輪臺(tái)企業(yè)網(wǎng)站建設(shè),專(zhuān)注與網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站設(shè)計(jì)成都h5網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為輪臺(tái)眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)的建站公司優(yōu)惠進(jìn)行中。
  • 變量的命名規(guī)則
    • min length && max information
    • 望而知意,便于記憶
    • 由多個(gè)單詞組成是,要么用下劃線隔開(kāi),要么每個(gè)單詞首字母大寫(xiě)
    • 盡量避免出現(xiàn)數(shù)字編號(hào),除非邏輯上需要
    • 所有宏定義、枚舉常數(shù)、只讀變量全部用大寫(xiě)字母命名,用下劃線分割單詞
    • 循環(huán)變量 n 、m、i、j、k;char c; int a[]; int *p 。

2.5. sizeof (最冤枉的關(guān)鍵字)

  • sizeof 是 32 個(gè)關(guān)鍵字中的一個(gè),而不是一個(gè)函數(shù)。
  • sizeof(int) * p 表示什么意思呢?

2.6. signed unsigned 關(guān)鍵字

  • 先來(lái)分析一段代碼
#include <stdio.h>
#include <string.h>

int main()
{
    signed char a[1000];
    int i = 0;

    for (i = 0; i < 1000; i++)
    {
        a[i] = -1 - i;
    }
    printf("%d\n", strlen(a));

    return 0;
}

當(dāng) i = 128 的時(shí)候,a[128] = -1 - 128 = -129 ,signed char 的取值范圍是 -128~127,所以超出了范圍,-129 源碼: 1 1000 0001 ,補(bǔ)碼:1 0111 1111 ,低 8 位 0111 1111 ,即 127。

當(dāng) i = 255 的時(shí)候,a[255] = -1 - 255 = -256 , -256 的原碼 11 0000 0000 補(bǔ)碼:11 0000 0000 ,低 8 位全為 0, strlen 遇到 '\0' 就結(jié)束,所以上述代碼輸出 255。

所以,char 類(lèi)型如果直接使用就用來(lái)表示字符,如果加了 signed 和 unsigned 限定符的話就用來(lái)表示數(shù)字。

2.7. if else 組合

  • bool變量與“零值”比較
bool b = FALSE;

if(b)
    printf("TRUE");
if(!b)
    printf("FALSE");

上面這種寫(xiě)法是值得推薦的,其他方式會(huì)有問(wèn)題。

  • float 變量與“零值”比較
    if(test > -EPSINON) || (test < EPSINON); // EPSINON 為定義好的精度
  • 指針變量與“零值”比較
    if(NULL == p)
    if(NULL != p)
  • 先處理正常情況后處理異常情況或者說(shuō)先處理概率大的,再處理概率小的
  • 賦值運(yùn)算不能用在產(chǎn)生 bool 值得表達(dá)式上
    if((x = y) != 0 )
    printf("------");

    這樣寫(xiě)是錯(cuò)誤的,應(yīng)該這樣寫(xiě)

    x = y;
    if(x != 0)
    printf("-----");

2.8. switch case 組合

當(dāng)嵌套比較少量的分支的時(shí)候可以使用 if else 組合,但是當(dāng)嵌套的分支多的時(shí)候就要使用 switch case 組合了,但是也不要刻意去創(chuàng)造一個(gè) switch 變量。

  • 每個(gè)case 的結(jié)尾不要忘了 break; 除非你有意讓多個(gè)分支重合。
  • 最后必須使用 default 分支,也需要 break; 。
  • 在 switch case 組合中禁止使用 return 語(yǔ)句。
  • switch 表達(dá)式不應(yīng)該是有效的 bool 值,例如下面的表達(dá)式是不允許的。
    switch (x == 0)
    {
    ......
    }
  • case 后面的值只能是×××或者字符型的常量或者常量表達(dá)式。
  • case 語(yǔ)句的拍立順序
    • 按照字母順序排列
    • 把正常情況放在前面,把異常情況放在后面,并做好注釋?zhuān)睦锸情_(kāi)始,哪里是結(jié)束。
    • 把常執(zhí)行的情況放在前面,不常執(zhí)行的情況放在后面。
  • 沒(méi)種情況的相關(guān)代碼要盡量簡(jiǎn)潔,必要時(shí)可以使用函數(shù)。

2.9. do while for 關(guān)鍵字

  • break 和 continue 的區(qū)別
    • break 跳出循環(huán)
    • continue 終止本次循環(huán),進(jìn)入下一次循環(huán)
  • 多重循環(huán)的時(shí)候應(yīng)該把最長(zhǎng)的循環(huán)放在最內(nèi)層,最短的循環(huán)放在最外層,這樣可以有效降低CPU切換循環(huán)層數(shù)的次數(shù)。
  • for 循環(huán)中,半開(kāi)區(qū)間比閉區(qū)間直觀,能寫(xiě)成 a < 10,絕不寫(xiě)成 a <= 9。
  • 不要在 for 循環(huán)體內(nèi)改變循環(huán)變量,否則會(huì)導(dǎo)致循環(huán)失控,像下面這種代碼是不好的。
    for(int i = 0; i < n; i++)
    {
    n = 10;
    }
  • 循環(huán)嵌套控制在3層以內(nèi)。
  • for 循環(huán)的控制語(yǔ)句不能包含任何浮點(diǎn)類(lèi)型的變量。

2.10. goto 關(guān)鍵字

goto 關(guān)鍵字可以在代碼中靈活的跳轉(zhuǎn),存在很大的爭(zhēng)議,有的建議慎用 goto ,有的建議不要用。我覺(jué)得用得好還是可以用。

int *p = NULL;
...
goto error;
...
error:
    return -1;

2.11. void 關(guān)鍵字

void *p = NULL;
int *p_int = NULL;
p = p_int;    //不會(huì)報(bào)錯(cuò),是正確的
p_int = p;    //報(bào)錯(cuò),是錯(cuò)誤的
  • void 修飾函數(shù)返回值和函數(shù)參數(shù)
    • 如果函數(shù)沒(méi)有返回值應(yīng)該將其聲明為 void 類(lèi)型,函數(shù)沒(méi)有參數(shù)也應(yīng)該將其聲明為 void 類(lèi)型
    • 如果函數(shù)的參數(shù)可以是任意類(lèi)型的指針,則聲明為 void *
      void *memcpy(void *dest, const void *src, size_t len)
  • void 不能代表一個(gè)真實(shí)的變量,例如下面的代碼是錯(cuò)的
    void a;
    fun(void a);

2.12. return 關(guān)鍵字

  • return 用來(lái)終止一個(gè)函數(shù),并返回其后跟的值。
    return(value);    //括號(hào)可以省略,但一般不省略,尤其是返回一個(gè)表達(dá)式的值得時(shí)候
  • return 不能返回指向棧內(nèi)存的指針,因?yàn)樵搩?nèi)存在函數(shù)體結(jié)束的時(shí)候就被銷(xiāo)毀了。

2.13. const 關(guān)鍵字

  • const 修飾的只讀變量必須在定義的同事初始化(首先 const 修飾的變量,其次是只讀,兩層含義)
  • 想一想 switch case 中 case 語(yǔ)句后面就可以是 const 修飾的只讀變量嗎?

讀書(shū)筆記-C語(yǔ)言關(guān)鍵字

先忽略類(lèi)型,看 const 離誰(shuí)近就修飾誰(shuí)

const int *p;           // const *p ,修飾 *p , p 可以改變, p 指向的內(nèi)容不可變
int const *p;           // const *p ,同上
int * const p;          // * const p ,修飾 p,p 不可以改變,p 指向的內(nèi)容可以改變
const int * const p;    // const * const p ,第一個(gè) const 修飾 *p,第二個(gè) const 修飾 p,所以 p 和 p 指向的內(nèi)容都不能改變
  • 修飾函數(shù)的參數(shù),當(dāng)不希望函數(shù)的參數(shù)在函數(shù)體中被改變的時(shí)候可以使用 const 修飾函數(shù)的參數(shù)。
  • 修飾函數(shù)的返回值(const int fun(void))。
  • 在另一個(gè)文件引用 const 變量時(shí)使用 extern const int i; 聲明即可,而不是定義。

2.14. volatile 最易變的關(guān)鍵字

  • volatile 關(guān)鍵字和 const 一樣,是一種類(lèi)型修飾符。它修飾的變量表示可以被某些編譯器未知的因素更改,比如操作系統(tǒng),硬件或其他線程。遇到這個(gè)關(guān)鍵字修飾的變量,編譯器就不對(duì)它做優(yōu)化,每次需要訪問(wèn)的時(shí)候都重新去內(nèi)存中讀取。

讀書(shū)筆記-C語(yǔ)言關(guān)鍵字

在這里 volatile 只是告訴編譯器 a 的值可能會(huì)被改變,需要訪問(wèn)時(shí)每次都要重新到內(nèi)存中去取。

2.15. extern 最會(huì)戴帽子的關(guān)鍵字

  • 修飾函數(shù)和變量,表示函數(shù)和變量不是在本文件定義的,在本文件只是使用 extern 聲明。

2.16. struct 關(guān)鍵字

空結(jié)構(gòu)體占多大內(nèi)存?大多數(shù)編譯器是 1,gcc 是 0。所以不要太相信書(shū)本上的東西,一定要自己親自驗(yàn)證。

  • 柔性數(shù)組
    • 不要驚訝,C語(yǔ)言中確實(shí)有柔性數(shù)組這個(gè)說(shuō)法的。
    • C99 中,結(jié)構(gòu)體最后一個(gè)成員允許是未知大小的數(shù)組,這就是柔性數(shù)組。但是柔性數(shù)組成員前必須至少有一個(gè)其他成員。sizeof 計(jì)算的大小不包含柔性數(shù)組所占的空間。為包含柔性數(shù)組的結(jié)構(gòu)體分配內(nèi)存要使用 malloc ,并且分配的內(nèi)存應(yīng)該大于 sizeof計(jì)算的值。
typedef struct st_type{
    int i;
    a[0];
}type_a;
//有些編譯器會(huì)報(bào)錯(cuò),可以改成
typedef struct st_type{
    int i;
    int a[];
}type_a;
//可以使用下面的代碼為柔性數(shù)組分配內(nèi)存,但是分配好之后使用 sizeof 計(jì)算結(jié)構(gòu)體的大小依然是不包含柔性數(shù)組所占的內(nèi)存的。
type_a *p = (type_a *)malloc(sizeof(type_a) + 100 * sizeof(int));

//記得用完之后要 free
free(p);
  • 結(jié)構(gòu)體里面能不能放函數(shù)呢?

讀書(shū)筆記-C語(yǔ)言關(guān)鍵字

2.17. union 關(guān)鍵字

  • union 中所有數(shù)據(jù)成員共用一塊內(nèi)存,同一時(shí)間只能存儲(chǔ)其中一個(gè)數(shù)據(jù)成員。union 的大小是大成員所占內(nèi)存的大小。
    2.17.1. 大小端對(duì) union 類(lèi)型數(shù)據(jù)的影響
union {
        int i;
        char ch;
}c;

c.i = 1;

//這時(shí)候 ch 只需要一個(gè)字節(jié)存儲(chǔ),在低地址,如果 ch 的值等于 1, 說(shuō)明 i 的值得低字節(jié) 1 存儲(chǔ)在低地址,是小端模式。Ubuntu、Windows 等 x86 架構(gòu)都是小端模式。
int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int *p1 = (int *)(&a + 1);
    int *p2 = (int *)((int)a + 1);
    printf("%x %x\n", p1[-1], *p2);

    return 0;
}
// 5 2000000 小端模式 大端模式 5 100

2.18. enum 關(guān)鍵字

enum enum_type_name{
    ENUM_CONST_1,
    ENUM_CONST_2,
    ENUM_CONST_3,
    ...
    ENUM_CONST_n
} enum_variable_name;
  • enum_type_name 是自定義的枚舉類(lèi)型,而 enum_variable_name 是 enum_type_name 類(lèi)型的一個(gè)變量。
  • sizeof(enum_variable_name) 的值是多少呢? 想想枚舉成員的類(lèi)型就會(huì)知道是 4 了, 空枚舉類(lèi)型的大小也是 4。

2.19. typedef 關(guān)鍵字,最偉大的縫紉師

  • typedef 是給已經(jīng)存在的數(shù)據(jù)類(lèi)型取一個(gè)別名,而不是重新定義新的數(shù)據(jù)類(lèi)型。
typedef struct student{
    int age;
    char name;
} stu_1, *stu_2;

const stu_2 student_1;    // 其實(shí)是 const (struct student *)student_1; 所以 修飾的是 student_1 本身,而不是指向的內(nèi)容
stu_2 const student_2;    // 其實(shí)是 (struct student *)const student_2; 所以 修飾的也是 student_2 這個(gè)指針本身,而不是指向的內(nèi)容
  • typedef 和 #define 之間的區(qū)別
#defien INT32 int
typedef int INT32_t

unsigned INT32 i = 10;    //沒(méi)問(wèn)題,只是替換
unsigned INT32_t j = 10;  //錯(cuò)誤,不支持

#defien PCHAR char*
typedef char* pchar

PCHAR ch2, ch3;    //ch2 是 char * 類(lèi)型,ch3 卻是 char 類(lèi)型
pchar ch3, ch5;    //ch4, ch5 都是 char * 類(lèi)型

讀書(shū)筆記-C語(yǔ)言關(guān)鍵字

3. 總結(jié)

不復(fù)習(xí)不知道,一復(fù)習(xí)嚇一跳,原來(lái) C語(yǔ)言 關(guān)鍵字還有這么多知識(shí)點(diǎn),以前也沒(méi)怎么注意,當(dāng)然不止這些,我只是記錄了我認(rèn)為比較重要而且容易搞混淆的。

如果你覺(jué)得我的讀書(shū)筆記對(duì)你有用,可以關(guān)注微信公眾號(hào) kalier 哦,最新的文章和讀書(shū)筆記都將在這里首發(fā)。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

分享標(biāo)題:讀書(shū)筆記-C語(yǔ)言關(guān)鍵字-創(chuàng)新互聯(lián)
瀏覽路徑:http://www.chinadenli.net/article34/ccesse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)網(wǎng)站制作微信公眾號(hào)網(wǎng)站排名網(wǎng)站設(shè)計(jì)公司網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)