[C 的那些眉角]永遠初始化你的變數 — 那個神秘的值

剛學 C 的時候,老師說過:「變數要記得初始化。」

我點點頭,然後還是繼續寫:

int count;
char buf[64];
int *ptr;

反正當下程式跑起來好像也沒問題。

直到有一天,發現程式出現一個「偶發性」的奇怪行為。
有時候正常,有時候不正常,完全沒有規律。

閱讀全文

[C 的那些眉角]#define 的陷阱 — 沒用好會掉進坑

#define 可以說是 C 語言裡最早學到的東西之一。

#define MAX_SIZE 256
#define PI 3.14159

看起來很無害,對吧?

但用久了才發現,#define 其實是個很容易出事的工具。
它不是變數、不是函式、不遵守 scope、不做型別檢查,
就是單純的文字替換。

而「單純的文字替換」,在某些情況下會產生你完全沒預期到的結果。

這篇記錄幾個我自己踩過、或在 code review 看過的坑。

閱讀全文

[C 的那些眉角]註解要寫「為什麼」,不是「做什麼」

記得很久以前,我寫註解的方式大概類似這樣:

i++;  // i 加 1

現在想起來,覺得很好笑。
當時覺得「有寫註解」這件事本身就是好習慣,
至於寫了什麼⋯⋯好像不太重要?

後來進公司,第一次被 senior 在 code review 上留言:
「這個註解跟沒寫一樣。」

很直接,但他說得對。

閱讀全文

[C 的那些眉角]命名不是小事 — 讓程式碼自己說話

前言

剛開始寫 C 的時候,我覺得命名這件事不重要。

反正編譯器不在乎變數叫 a 還是 temperature,程式跑起來結果一樣。
直到有一天,我打開三個月前自己寫的程式碼,盯著一個叫 tmp2 的變數看了五分鐘,
完全不知道它是幹嘛的。

那個人是我自己。

從那之後,我開始認真對待命名這件事。這篇是我的一些整理,
不是什麼業界標準,就是我覺得「這樣寫,之後比較不會想罵自己」的習慣。


壞命名長什麼樣子

閱讀全文