| 類型 | 字節數 | 示例/備註 |
|---|---|---|
char | 1 | char ch='a'; |
short int | 2 | |
int | 4 | |
long int | 4 | Windows 64 為 4,Linux 64 為 8 (LP64) |
long long | 8 | |
float | 4 | ~7 位有效數字 |
double | 8 | ~15 位有效數字 |
long double | 16 | x86 延伸精度 80 位,佔 16 字節對齊 |
技巧:sizeof(var) 或 sizeof(type) 編譯期常量,無運行開銷。
1. 後綴: () [] -> . ++ --
2. 一元: ++ -- + - ! ~ * & (type) sizeof (右結合)
3. 乘除模: * / % (左結合)
4. 加減: + - (左結合)
5. 移位: << >> (左結合)
6. 關系: < <= > >= (左結合)
7. 相等: == != (左結合)
8. 位與: & (左結合)
9. 位異或: ^ (左結合)
10. 位或: | (左結合)
11. 邏輯與: && (左結合)
12. 邏輯或: || (左結合)
13. 條件: ? : (右結合)
14. 賦值: = += -= *= /= %= &= ^= |= <<= >>= (右結合)
15. 逗號: , (左結合)
a < b ? a : b // 返回較小值,注意優先級低於賦值
int max = (a > b) ? a : b; // 建議加括號
int a = 10;
double b = 10.23;
printf("%d\n", (int)(a + b)); // 20,先加後截斷
printf("%d\n", a + (int)b); // 20,先截斷後加
int a=10, b=10;
printf("%d %d\n", a++, ++b); // 輸出 10 11
printf("%d %d\n", a, b); // 輸出 11 11
// 危險!未定義行為(C標準不保證求值順序)
// int i=1; a[i++] = i++; // UB
// printf("%d %d\n", ++i, i++); // UB
鐵律:同一表達式中,對同一變量進行多次修改,或修改後又讀取(非為了確定新值),行為未定義。
sizeof(arr):數組類型時返回整個數組大小(不退化為指針)sizeof(ptr):指針變量返回指針大小(32位=4, 64位=8)strlen(str):運行期計算字符串長度(遇 '\0' 停止),參數退化為指針sizeof("abc") = 4(含結尾 '\0'),strlen("abc") = 3掌握類型大小、運算符優先級、副作用陷阱、sizeof 與 strlen 區別,是寫出正確、可移植、無 UB 代碼的基石。建議編譯時開啟 -Wall -Wextra -Wpedantic -std=c11 並使用靜態分析工具(Cppcheck, Clang Static Analyzer)。