浙江福彩3d走势图
我們來自五湖四海,不為別的,只因有共同的愛好,為中國互聯網發展出一分力!

PcrazyC的C語言總結

2012年10月03日01:16 閱讀: 1201 次

原帖及討論:http://bbs.bccn.net/thread-129240-1-1.html

總算把C語言又看了一遍,總結如下:

1.    二制數中原碼.反碼.補碼以及進制之間的轉換:

原碼:由符號位和該數的絕對值的二進制數組成.
反碼:負數的反碼為除符號位以外所有位均取反的結果.正數
          的反碼與原碼相同,其補碼也一樣,后面不說了.
補碼:負數的補碼是在其反碼的基礎之上加1;
下面以-123為例求其各碼:
原碼:符號位為1,二進制數為1111011,(其轉換參考下面進制的轉換)所以其原碼為11111011.
反碼:10000100
補碼:10000101
進制的轉換:
十進制數轉其他:
(1):整數:以十進制數123轉換為八進制數為例:
    123/8=15……3    ----------最低位
    15/8=1………7
    1/8=0………1 -----------最高位
    結果就是173(從下到上),商為0止
(2):小數:0.325轉換為二制數為例:
        乘2                    純小數部分            整數部分
    2 * 0.375=0.750             0.750                    0
    2 * 0.750=1.5               0.5                      1
    2 * 0.5 =1.0                0                        1
結果就為0.011(從上到下),純小數為0終止.否則一直進行下去
直到字節數已滿.
其它轉十進制:以十六進制數A5FE轉換十進制數為例:
    A5FE=A * 16^3+5 *16^2+F * 16^1+E=42494
二進制數:
    十進制數不用說了,轉八進制數時,從低位起,每三位對一位,不足補0;轉十六進制數,從低位起每四位對一位,不足補0;其它轉二進制數是一個相反的過程.
下面舉兩個例子:
(1);二進制數10101101轉八進制數:
    010      101        101
    |      |        |
    2         5        5
    結果就是255
(2):十六進制A69E數轉二制數:
    A    6    9    E
    |    |    |    |
    1010  0110   1001  1110
    結果就是1010011010011110

2.    變量在內在中的存放與轉換.

(1)    存放:
整型數據是轉換成相應的補碼后直接存放在內存中,而實型與整型的存放不同,它是以指數形式存放,即符號位+小數部分+指數部分.比如:12345在內在中的存放形式是這樣的:第一位符號位是’+’,接下來存放的是小數,即0.12345,最后是指數5,而小數部分和指數部分所占的位數因編譯系統的不同而不同,不必深究,
(2)    轉換:
    所有可以轉換的數據類型之間的轉換都遵循一個規則:按存儲單元的存儲形式直接傳送,從低位開始.比如:將十進制數-123轉換為八進制數:    將其補碼原樣傳送由于八進制數無符號(十六進制數也一樣),所以最高位的1在八進制數的內在單元中已不代表符號,而代表數值進行運算.不同的編譯器和機器所得的結果不一定相同,因為整型變量所占的字節數不同,現以十六位機(另外還與編譯器有關,假如整型占兩個字節)為例:-123的補碼為1111111110000101,將其換算成八進制數為177605,而在32位機上(假如整形占4個字節),其結果就是37777777605.
實型轉換成整型時,得到的絕不是你想要的結果,因為實型的存儲形式是按指數形式存儲的,低位中存儲的是指數部分,當傳送的時候,只是將指數部分或指數部分加上小數部分的小部分傳送給整型變量,得到的結果不可能是你想要的結果.

3.字符-----    ‘\’的作用:

與一些字母組成轉義字符,比如\t、\n之類的,與數字組成代表八進制數.比如:\123代表八進制數123即十進制數83.另外說明一下\r,其作用是將當前位置移到本行開頭,后面再輸入字符時,原有的字符將會被覆蓋,比如printf(“abcd\r  \n“);將會輸出”  cd”,而不是”  abcd”.還有\b也是一樣.

4.自增自減:

(1).運算符在前時,先進行運算再進行取值,運算符在后時,先進行取值再進行運算.比如a=++i ;相當于i=i+1;a=i ; ,而a=i++;則相當于a=i;i=i+1;
(2).自增自減運算符不能用于常量 (表達式結果也是常量),只能用于變量.
(3).警告:不要使用+++,---之類的運算符,不同的編譯器有不同的結果,也不要在一個式子中對同一變量進行多次++或--,比如:(i++)+(i++)+(i++),同樣不同的編譯器會得到不同的結果.

5.逗號運算符.

結合方向是自左向右,結果為最后一個表達式的值,其優先級最低.注意函數中的”,”一般是參數分隔符,不是逗號運算符,詳情見44樓:
http://bbs.bc-cn.net/dispbbs.asp?boardid=5&replyid=62343&id=124695&page=1&skin=0&star=3

6.退出過程.

    (1)continue :用于結束某次循環繼續下一循環.
    (2)break:    用于結束循環或結束switch語句.
    (3)return:    用于結束某函數.
    (4)exit:        用于結束某一程序

7.printf("%*s\n",M,"字符串"+N)的用法說明

先看N的值,去掉字符串的左邊N個字符,再看字符串的位數與M的值的大小
1.若字符串的位數比M大,然后輸出
2.若字符串的位數比M小,就先在M的左邊補空格,使字符串的長度等于M,然后輸出
printf("%-*s\n",M,"字符串"+N),
先看N的值,去掉字符串的左邊N個字符,再看字符串的位數與M的值的大小
1.若字符串的位數比M大,然后輸出
2.若字符串的位數比M小,就先在M的右邊補空格,使字符串的長度等于M,然后輸出

8.scanf函數的用法和說明

(1),指定輸入列數,系統自動截取,比如:scanf(“%3d”,&a);輸入1234;a=123;
(2).*的用法,跳過指定列數.比scanf(“%2d%*3d%d”,&a,&b);輸入1234567,a=12,b=67;345被跳過
(3).輸入時不能指定精度
(4).輸入數據時要與格式控制保持一致,格式控制中用”,”分開,輸入時也要用”,”分開,格式控制中用”:”分開,輸入時也要用”:”分開, 否則結果不可預料.如果格式控制中沒有用任何字符隔開,你也不要用任何字符隔開,包括空格,比如:scanf(“%c%c”,&a,&b);如果輸入a b (中間有空格),此時a=’a’,b=’’,而b卻存入緩存中.另外格式控制后是變量地址,普通變量不要忘了取地址運算符”&”.本來代表地址的也不要多加”&”.比如指針(數組名也是指針)不用加”&”.
(5).清除緩存.當緩存中有數據時,使用scanf時,不會提示輸入字符,而是直接將緩存中的數據(包括回車符)賦給變量,直到緩存中沒有變量.這樣就要在調用scanf之前清除緩存,用語句fflush(stdin);來清除緩存.另外用scanf(“ %c”,&a);在格式控制中多加一個空格可以清除一個字符,當有多個字符時就不有完全清除,還可以用 * 來清除緩存,和空格作用差不多,比如:scanf(“%*5c%c”,&a);可以清除緩存中五個字符.最好是直接用fflush (stdin);

9.易錯點    

    (1).if (a=4)…; 相當于a=4;if(4)…;
    (2).switch語句要注意break;
    (3).do {…} while; 要注意最后一個分號不能丟
    (4).不能定義動態數組,比如:scanf (“%d”,&n); int a[n];

10.void的說明.

Void代表空類型,在定義指針變量或函數時可以定義為void型,定義指針變量后可以在用的時候通過強制類型轉換使其指向任何類型的數據.定義函數時,只是說明不能有返回值.如果函數中出現return就會報錯.

11.局部變量.全局變量

作用域:局部變量的作用域從定義處到該過程(可以是一個復合語句也可以是一個函數)結束.全局變量的作用域從定義處到文件結束.
存在性:局部變量(未聲明為static類型)當所在過程被調用時存在,結束后釋放,如果定義為static就會一直存在直到程序結束,但其作用域不受影響.全局變量在被定義后就一直存在.直到程序結束.
優先級:當兩個相同變量的作用域重復(一個包含另一個),在較小的作用域范圍內,較大作用域的那個變量被屏蔽.比如:i被定義為一個全局變量,在其作用域內又定義了一個局部變量i,在局部變量i作用域內,全局變量i被屏蔽.又如.在一個函數中定義了一個局部變量i,而在該函數的某個復合語句中又定義了一個變量i,則在該復合語句中局部變量i將被屏蔽.

12.預編譯處理命令

#define:宏定義只是在編譯前對代碼作簡單的字符串替換,不會考慮任何錯誤.宏定義不是語句,后面不要加";".
#include:
    “ ”與< >之前的區別.” “是從用戶當前目錄尋找包含文件,若找不到就會到庫函數所在目錄中尋找,再找不到就報錯,而< >則是直接在庫函數所在目錄中尋找,找不到報錯.

13.指針:

(1).指針的加減法:指針的加減法不是作簡單的加減,而是以指針變量所占的字節數為單位進行加減.
(2).數組名是指針常量,不能改變其值,比如數組a[ ],如果進行a++;就會報錯
(3). 雖然指針變量中存放的地址是整型數據,但不能將整型數據直接賦值給指針變量,應該這樣(假如p為int *型),p=(int *)1000;但禁用些法,因為你不知道1000這個單元有沒有被其它單元占用,后果不可預料,同樣也不能將一個指針變量的值直接賦給整形變量,也要進行強制類型轉換.
(4)定義指針后,在使用之前一定要先給它賦初值,切記
(5).二維數組中指針問題(int a[3] [4]),數組名a是一個指向行的指針(指向數組),而在其前面加一個 * ,*a就是指向列的指針(指向無素).a與*都是指向a[0][0];但a+1(行指針)指向a[1][0];而*a+1(列指針,和*(a+0)+1一樣)卻指向a[0][1];同樣在a+1前加一個*就又變成列指針了,*(a+1)+2就指向a[1][2].
(6),復雜類型的說明:從變量名處起,根據運算符優先級結合,一步一步分析,下面以一個比較復雜的類型(  int * (*p(int))[ ]  )為例:
第一步,p先與()結合,說明是一個函數,第二步,()內有一個int,說明函數有一個形參為int型,第三步與*結合,說明返回的是一個指針變量,第四步與[ ]結合,說明該指針變量指向數組,第五步再與*結合,說明數組中的元素為指針型,第六步說明數組中的指針元素的類型為int型,完畢,所以這是一個返回一個由整型指針變量組成的數組的指針變量的函數.

14枚舉類型:

    枚舉元素為常量,只有在定義的時候能對它們進行賦值(不賦值時,系統給它們賦值,從0開始遞增),在其它時候均不能進行賦值,


大家有好的經驗發上來,我加到里面去,如有錯誤請指示

分享到: 更多
藍客門戶
©2001-2020 中國藍客聯盟 版權所有.
關于藍客聯盟歷史宗旨章程技術服務聯系我們藍客社區

浙江福彩3d走势图 快乐十分每天必出号 赛车怎么用3000赢10万 最笨重的动物打一生肖 上海时时彩几点开始的 体彩p5 博彩篮球赚钱 新疆18选7中奖号码 北京赛车pk10牛牛打法 湖北11选5-top遗漏走势图 时时彩