float a = 12.5f;
printf("%d\n", a); // 輸出 0
printf("%d\n", (int)a); // 輸出 12
printf("%d\n", *(int*)&a); // 輸出 1095237632
教訓:`printf` 格式字串必須與實際參數類型嚴格匹配。這也是 C++ 引入 `iostream` 型別安全機制的原因。
"hello"[2] == 2["hello"] // 皆為 'l'
因為 `a[b]` 等價於 `*(a+b)`,加法交換律成立。
int a = 010; // 八進制 = 十進制 8
int b = 09; // 編譯錯誤:9 非八進制數字
C 標準:以 0 開頭的整數字面量為八進制。
int i = 0;
sizeof(i++); // 不會執行 i++,i 仍為 0
// sizeof 是編譯期運算子,僅計算類型大小
switch(x) {
int val = 10; // 跳過初始化!
case 1: val = 20; break;
}
案例標籤會跳過聲明語句,導致未初始化變量。解決:用 `{}` 包裹案例塊。
int cnt = printf("Hello"); // cnt = 5(輸出字符數)
除錯輸出請用 `stderr` 或 `fflush(stdout)`,否則程式崩潰前輸出可能丟失。
struct { char c; int i; } s; // sizeof 通常為 8(非 5)
// 編譯器插入填充位元組對齊 int
char *p = "hello";
p[0] = 'H'; // 未定義行為(可能崩潰)
// 正確:char p[] = "hello";
unsigned int u = 10;
int i = -1;
if (u > i) printf("true"); // 輸出 true!-1 提升為巨大無號數