回覆列表
  • 1 # 使用者1447587979780

    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萬5買什麼車好?