1:
int跟signed int是一回事,short、long亦然,但char不是
char、signed char、unsigned char在邏輯上是三種類型,比較直觀的體現就是在C++的過載中,你可以定義引數型別分別為它們的三個同名函式
但實現上的型別只有兩種,char可能是signed也可能是unsigned的,看編譯器實現,現在很多編譯器預設是signed,但可以透過選項配置或引數指定為unsigned
2:
你是否已經習慣了“\xHH”這種兩個H的寫法的16進位制換碼序列?但實際上C規定H可以任意多的,可以試試:cout << strlen("\x0012") << endl;
不過如果後面數字太大,是有可能出現溢位的情況,不同編譯器處理方式不同,gcc會報錯,vc我記得是擷取末尾4位元組,可以試試:cout << "\x1234567890000000000000000000041" << endl;
那如果我想要\x00、1、2這仨字元組成的字串字面量呢,可以這樣寫:"\x00""12",多個字面量連著寫,會幫你連起來
3:
說到字串還想到一個,很多語言都支援用反斜槓放在行尾來折行,C++也可以,不過這種程式碼:
有人可能會認為編譯失敗,因為行尾的反斜槓被前面一個轉義了,但實際上一些編譯器(比如gcc)並不會到詞法分析階段來搞這個事情,採用了非常粗暴的方式:直接讀入原始檔然後將裡面的"\\\n"替換為空串,然後再開始編譯,所以上面的程式碼其實等於:
第一個反斜槓跟第二行的t連起來,就是tab符了
4:
還是字串,C語言以前有三字元換碼序列,比如??=表示#等,不過現在很多編譯器已經不想支援這種東東了,比如新的gcc會給出個warning,新標準好像也不打算支援了
據說是因為IBM的字符集和老的一些鍵盤沒有#之類的字元,很多老程式碼是這種形式寫的,這個特性的去留問題後面還引起爭論,有大佬直接說你們換個新鍵盤就好啦
5:
C語言的sizeof是一個關鍵字、字首單目運算子,而不是函式,這意味著你可以直接寫:cout << sizeof 1 << endl;
然後,強制型別轉換運算、指標解引用運算也是字首單目運算子,而我們知道字首單目運算子是右結合的,那麼這個式子:
應該被解釋為:對指標p解引用,然後強制轉換為int型別,然後取sizeof咯?哈哈哈
雖然邏輯嚴謹,但其實不是的,因為還有特殊規定:sizeof後面如果是一個強制型別轉換的表示式,則必須加括號,所以不用擔心,上面的程式碼是int的大小乘以p
最好還是給所有sizeof加上括號吧。。。
6:
大家是不是都習慣用stdint.h中的int32_t這些型別了,很多資料也推薦用,但這些型別其實是optional的,就是說可能是不提供或缺失,例如ILP64模型下,就沒有32位的整型,不過大部分平臺還是有的啦
其他的想到再補充吧
1:
int跟signed int是一回事,short、long亦然,但char不是
char、signed char、unsigned char在邏輯上是三種類型,比較直觀的體現就是在C++的過載中,你可以定義引數型別分別為它們的三個同名函式
但實現上的型別只有兩種,char可能是signed也可能是unsigned的,看編譯器實現,現在很多編譯器預設是signed,但可以透過選項配置或引數指定為unsigned
2:
你是否已經習慣了“\xHH”這種兩個H的寫法的16進位制換碼序列?但實際上C規定H可以任意多的,可以試試:cout << strlen("\x0012") << endl;
不過如果後面數字太大,是有可能出現溢位的情況,不同編譯器處理方式不同,gcc會報錯,vc我記得是擷取末尾4位元組,可以試試:cout << "\x1234567890000000000000000000041" << endl;
那如果我想要\x00、1、2這仨字元組成的字串字面量呢,可以這樣寫:"\x00""12",多個字面量連著寫,會幫你連起來
3:
說到字串還想到一個,很多語言都支援用反斜槓放在行尾來折行,C++也可以,不過這種程式碼:
有人可能會認為編譯失敗,因為行尾的反斜槓被前面一個轉義了,但實際上一些編譯器(比如gcc)並不會到詞法分析階段來搞這個事情,採用了非常粗暴的方式:直接讀入原始檔然後將裡面的"\\\n"替換為空串,然後再開始編譯,所以上面的程式碼其實等於:
第一個反斜槓跟第二行的t連起來,就是tab符了
4:
還是字串,C語言以前有三字元換碼序列,比如??=表示#等,不過現在很多編譯器已經不想支援這種東東了,比如新的gcc會給出個warning,新標準好像也不打算支援了
據說是因為IBM的字符集和老的一些鍵盤沒有#之類的字元,很多老程式碼是這種形式寫的,這個特性的去留問題後面還引起爭論,有大佬直接說你們換個新鍵盤就好啦
5:
C語言的sizeof是一個關鍵字、字首單目運算子,而不是函式,這意味著你可以直接寫:cout << sizeof 1 << endl;
然後,強制型別轉換運算、指標解引用運算也是字首單目運算子,而我們知道字首單目運算子是右結合的,那麼這個式子:
應該被解釋為:對指標p解引用,然後強制轉換為int型別,然後取sizeof咯?哈哈哈
雖然邏輯嚴謹,但其實不是的,因為還有特殊規定:sizeof後面如果是一個強制型別轉換的表示式,則必須加括號,所以不用擔心,上面的程式碼是int的大小乘以p
最好還是給所有sizeof加上括號吧。。。
6:
大家是不是都習慣用stdint.h中的int32_t這些型別了,很多資料也推薦用,但這些型別其實是optional的,就是說可能是不提供或缺失,例如ILP64模型下,就沒有32位的整型,不過大部分平臺還是有的啦
其他的想到再補充吧