時間複雜度 – 陪你刷題

為什麼要學 Big O

學習演算法和資料結構就是為了寫出高效率的程式碼,不只在時間上需要快速,在空間上的消耗更要節省,而 Big O 就是用來衡量演算法效率的單位。因此,在學習各種資料結構與演算法帶來的好處之前,要先懂得如何透過 Big O 辨別程式碼的效率。

閱讀全文〈時間複雜度 – 陪你刷題〉

淺談 C 語言的型態轉換

前言

最近公司專案導入 static code check tool 並且採用較嚴格的 coding rule 來檢查,團隊內不乏許多資深的工程師,但檢查出相當多型態轉換的問題,促使我想寫下這篇文章釐清 C 語言型態轉換的規則及可能的問題。

可能的安全問題

C語言包含不同的型態,不同型態之間做運算就會適用不同規則,這也是 C 語言型態轉換困難的地方,進行型態轉換,可能會發生以下問題是值得我們留意的

  • loss of value: 如果今天我們將 integer 轉換到 char 型態,由於 int 型態大小遠大於 char,就會造成這種狀況
  • loss of sign: 如果我們將 unsigned int 與 signed int 進行運算,原本 signed int 被迫轉換成 unsigned int,就會造成這種狀況
  • loss of precision: 從 floating 型態轉換到 integer 型態
  • loss of layout: 型態轉換發生在從 pointer to struct 到 pointer to char

型態轉換又分為兩種:

  1. explicit conversion: 就是大家會在教科書上看到的 cast,開發者可以強制轉換任何資料的 data type。
  2. implicit conversion: 這是大部分開發者都會疏忽的,由 compiler 來幫你轉換型態,以下會描述什麼情況下會發生 implicit conversion,我們並不需要牢記這些規則,但必須要在開發時候隨時留意。

閱讀全文〈淺談 C 語言的型態轉換〉