一、關於型別轉換
k&r c的不說了,說了還容易混淆,只說ansi c的:
如果其中乙個運算元的型別是unsigned long int,那麼另外乙個運算元也被轉換為unsigned long int。其次其中乙個運算元的型別是long int,而另乙個運算元的型別是unsigned int,如果long int能夠完整表示unsigned int 的所有值,那麼unsigned int 型別運算元被轉換為long int ,如果long int 不能完整表示unsigned int 的所有值,那麼兩個數都被轉換為unsigned long int 。再再次,如果其中乙個運算元是unsigned int,那麼另外乙個運算元(int、char、unsigned char)被轉換為unsigned int。所上情況以外,兩個運算元都為int。
通俗來說:
當執行蒜素運算時,運算元的型別如果不同,就會發生轉換。資料型別一般操作浮點精度更高、長度更長的方向轉換,整數型如果轉換為singed不會丟失資訊,就轉換為singed,否則轉換為unsigned。
看下面兩個例子:
例1:小於號左右兩邊運算元都轉換為int
int main()
例2:-1轉換為unsigned int
int main()
二、幾個怪異的宣告標示符
volatile:
它被設計用來修飾被不同執行緒訪問和修改的變數。確保本條指令不會因編譯器優化而省略,且要求每次直接讀值。優化器在用到這個變數時必須每次都小心地重新讀取這個變數的值,而不是使用儲存在暫存器
裡的備份。
register:
register修飾符暗示
編譯程式
相應的變數
將被頻繁地使用,如果可能的話,應將其儲存在cpu的
暫存器中,以加快其儲存速度。
三、關於sizeof
#include int main()
; struct test2
; struct test3
; struct test4
; printf("test1:%d, test2:%d, test3:%d, test4:%d\n", sizeof(struct test1), sizeof(struct test2), sizeof(struct test3), sizeof(struct test4));
return 0;
}
在vs2008下輸出結果為8、8、16、16,在下結果為8、8、12、12。
原因見這個地方:
C專家程式設計(一)
第一章 c 創越時空的迷霧 1 根據編譯器設計思路發展的語言特性 1 陣列下標從0開始,基於偏移量。2 表示式中陣列名可看作是指標,作為函式引數,陣列隱式轉換為指標,不需要複製陣列內容。2 c預編譯 1 字串替換 foo bar 2 標頭檔案包含 h 3 通用 模板擴充套件 巨集的實際引數只是原樣輸...
C專家程式設計
說到c語言,首稱 c程式語言 這是一本入門和進修均可的書籍,值得讀三遍以上,方才有味。進修書籍如 c專家程式設計 是一本c語言較高層次的書,是成為c語言專家的必經之路。我自以為達到了一定的 程度,才開始學習這本書的。人言,c語言是一門藝術,需要多年歷練才能達到較為完善的境界,此言不虛。c語言進修書籍...
C 專家程式設計
2011.9.4 c 專家程式設計 1 容易混淆的 const 關鍵字const 並不能把乙個變數變為常量,它修飾的符號僅表示該符號的值不能被賦值,也就意味著唯讀不可寫,但它並不能防止通過程式內部 甚至外部,其它函式 的方法來修改它。const 最有用支出是用來限定函式的形參,這樣該函式不會修改實參...