欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
C陷阱和缺陷學(xué)習筆記

詞法陷阱:

    1        = 不同于==不要在程序中將兩者寫(xiě)錯,小心。將表達式與常量比較時(shí),可將常量放在左邊。

    2        &和| 不同于&& 和 ||.

    3        詞法分析中的貪心法:每個(gè)符號應該包含盡可能多的字符。如果(編譯器的)輸入流截至某個(gè)字符前都已經(jīng)分解為一個(gè)個(gè)符號,那么下一個(gè)符號將包括從該字符之后可能組成一個(gè)字符的最長(cháng)字符串。如y = x/*p,那么/*將作為一個(gè)符號對待。

    4        如果一個(gè)整形變量第一個(gè)字符是0,那么該常量被視為8進(jìn)制數。

    5        Char c = ‘cxf’。在vc和Gcc中,依次用后一個(gè)字符覆蓋前一個(gè)字符,最后得到的整數值是最后一個(gè)字符的整數值。

    語(yǔ)法陷阱:

    1       c變量聲明由類(lèi)型和一組類(lèi)似表達式的聲明符組成。聲明符與表達式類(lèi)似,對他求值返回一個(gè)聲明中給定類(lèi)型的結果。如float f,((f))。知道了如何聲明一個(gè)變量,那么該類(lèi)型的類(lèi)型轉換符就很容易得到了:將聲明中的變量名和分號去掉,再將剩余的部分用個(gè)括號“封裝”起來(lái)即可。如float(*h)(),則float(*)()就是“指向返回值是浮點(diǎn)類(lèi)型的函數的指針”的類(lèi)型轉換符。(*(void(*)())0)()調用地址為0位置的的例程。

    2        運算符優(yōu)先級:?jiǎn)文窟\算符,算術(shù)運算符,移位,關(guān)系,邏輯,條件, 賦值。

    3        switch語(yǔ)句中case中,不要忘記break,若刻意要省略,請加注釋。

    4        C語(yǔ)言中只有一維數組,而且數組的大小必須在編譯期間就作為一個(gè)常數確定下來(lái)。多維數組是通過(guò)一維數組仿真的,因為數組的元素可以是任何對象,當然也可以是數組。

    對數組,我們只能做兩件事,確定其大小,以及獲得指向該數組下標為0的元素的指針。其它的有關(guān)數組的操作,實(shí)際上是通過(guò)指針進(jìn)行的。

    語(yǔ)義陷阱:

    1          空指針并不等于空字符串。編譯器保證由0轉換而來(lái)的指針不等于任何有效的指針。當將0賦值非一個(gè)指針變量時(shí),絕對不能企圖使用該指針指向的內存中存儲的內容。

    2         在使用范圍時(shí),使用不對稱(chēng)邊界方式。第一個(gè)是“入界點(diǎn)”(序列中第一個(gè)被占用的元素),第二個(gè)是“出界點(diǎn)”(序列中第一個(gè)被釋放的元算)。For(intI = 0 ; I < 10; i++)。盡量不要使用For(int I = 0 ; I <=9; i++)。

    3          數組的下標如果用入界口加出界口來(lái)表達(即10個(gè)元素,其下標為0 <= n < 10 ),則元素個(gè)數即為上界與下界之差,即下界。若為空,則上界等于下界。任何情況下上界也永遠不可能小于下界。

    盡量采用非對稱(chēng)邊界法。

    一個(gè)有N個(gè)元素的數組 ,我們可以使用a[N]進(jìn)行比較和賦值,但不能引用其內容。

    4          C語(yǔ)言中只有4個(gè)運算符存在規定的求值順序:&&,| |, ?:和,。其他的運算符對器操作數求值的順序是未定義的。特別的是,賦值運算符并不保證任何求值順序。Y[i]=X[i++] 錯誤。

    5          記得為main提供返回值。

    連接:

    1          為避免命名沖突,請對變量或函數使用static修飾符。為了定義與庫函數中同名的函數,可將文件中要定義的函數加static修飾。

    2          使用外部函數前,一定要聲明。否則,沒(méi)有聲明,函數返回值將默認為整型。

    3          外部聲明要與定義類(lèi)型一致。不能聲明是extern int n,而定義是long n.

    4          同一個(gè)外部變量在不同的地方被聲明為不同的類(lèi)型,這種錯誤大部分編譯器是檢不出來(lái)的。

    char file[]= "/etc/password";

    與

    extern char* file;

    是不一樣的。

    庫函數:

    1          注意getchar()返回整型,不是字符型。

    2          為了保持與過(guò)去不能同時(shí)進(jìn)行讀寫(xiě)操作的程序的向下兼容性,一個(gè)輸入操作不能隨后直接緊跟一個(gè)輸出操作,反之依然,如果要同時(shí)進(jìn)行輸入和輸出操作,必須在其中插入fseek函數的調用。例:

 FILE *fp;
     struct record rec;
       while (fread((char *)&rec, sizeof(rec),1,fp) = 1)
           {
     if(/* */)
                {
          fseek(fp, -(long)sizeof(rec), 1);
          fwrite((char *)&rec, sizeof(rec), 1,fp);
          fseek(fp, 0l,1);
         }
}

    3         緩沖輸出和內存分配:

    可通過(guò)setbuf函數控制程序的緩沖輸出。

 #include <stdio.h>
void main(void)
{
     int c;
     char buf[BUFSIZ];
     setbuf(stdout,buf);

     while((c = getchar()) != EOF)
          putchar(c);
}

    這個(gè)是不對的。buf最后一次被清空是在什么時(shí)候?答案是在main函數結束之后,作為程序交回控制給操作系統之前C運行時(shí)庫所必須進(jìn)行的清理工作的一部分。但是在此之前buf已經(jīng)被釋放。

    解決方法一是加上static 聲明。也可以把buf聲明完全移到main函數之外。第二種辦法是動(dòng)態(tài)分配緩沖區,在程序中并不主動(dòng)釋放分配的緩沖區

    4         不能直接使用errno檢測錯誤,應先檢測作為錯誤指示的返回值,確定程序已經(jīng)執行失敗。然后,再檢查errno,搞清原因。

    /* 調用庫函數 */

    if(返回的錯誤值)

    檢查errno

    5         庫函數signal

    從理論上說(shuō),一個(gè)信號可能在C程序執行期間的任何時(shí)刻上發(fā)生,甚至可能出現在某些復雜的庫函數(如malloc)的執行過(guò)程中。因此從安全的角度講,信號的處理函數不應該調用上述類(lèi)型的庫函數?;谕瑯拥脑?,從signal處理函數中使用longjump退出,通常情況下也是不安全的:因為信號可能發(fā)生在malloc 或者其它庫函數開(kāi)始更新某個(gè)數據結構,卻又沒(méi)有最后完成的過(guò)程中。因此signal處理函數能夠做的安全的事情,似乎就只有設置一個(gè)標志然后返回,期待以后主程序能夠檢查到這個(gè)標志,發(fā)現一個(gè)信號已經(jīng)發(fā)生。

   然而,就算這樣做也并不總是安全的。當一個(gè)算術(shù)運算錯誤引發(fā)一個(gè)信號時(shí),某些機器在signal處理函數返回后還將重新執行失敗的操作。因此對于算術(shù)運算錯誤,signal處理函數的惟一安全、可移植的操作就是打印一條出錯消息,然后使用longjump或exit立即退出程序。

    當一個(gè)程序異常終止時(shí),程序輸出的最后幾行常常會(huì )丟失,原因是緩沖。

    預處理器:

    1         不要忽視宏中的括號。

    2         宏不是函數。將宏中的參數都加上括號,將整個(gè)結果表達式也括起來(lái)。防止副作用。

    3         宏不是語(yǔ)句:#define assert(e) ((void)((e)||_assert_error(_FILE_,_LINE_)))

    4         宏不是類(lèi)型定義;不要用#define定義類(lèi)型,而是用typedef定義新類(lèi)型。

    可移植性:

    1   因為字符串常量可以用來(lái)表示一個(gè)字符數組,所以在數組名出現的地方都可以用字符串常量末端替換。     如:    "0123456789"[n%10]

    2  注意C標準的變化,新特性的使用。

    3   c標準所能保證的只是,c實(shí)現必須能夠區別出前6個(gè)字符不同的外部名稱(chēng),且并沒(méi)有要求區分大小寫(xiě)。避免諸如:print_char(),print_int()等

    4  整數長(cháng)度的相對長(cháng)度規定:short類(lèi)型的值肯定能被int型容納,int型肯定能被long型整數容納;一個(gè)普通(int類(lèi)型)整數足夠大以容納任何數組下標;字符長(cháng)度由硬件特性決定。

    5   隨機數最大值:RAND_MAX

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C語(yǔ)言陷阱和缺陷
『C程序設計』讀書(shū)筆記
【C語(yǔ)言】C語(yǔ)言基礎知識概念
《C語(yǔ)言程序設計教程》第八章指針
帶你了解c++和c中字符串的使用
csdn(18條消息) 2021版C++教程,C++進(jìn)階教程(最全C++教程)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久