首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言基礎速查:數據類型佔用字節、運算符優先級、表達式求值、強制轉換、自增自減陷阱

     編輯:關於C語言

數據類型佔用字節(Linux x64 / ILP64 模型)

類型字節數示例/備註
char1char ch='a';
short int2
int4
long int4Windows 64 為 4,Linux 64 為 8 (LP64)
long long8
float4~7 位有效數字
double8~15 位有效數字
long double16x86 延伸精度 80 位,佔 16 字節對齊

技巧:sizeof(var) 或 sizeof(type) 編譯期常量,無運行開銷。

運算符優先級與結合性(高到低)


1. 後綴: () [] -> . ++ --
2. 一元: ++ -- + - ! ~ * & (type) sizeof (右結合)
3. 乘除模: * / % (左結合)
4. 加減: + - (左結合)
5. 移位: << >> (左結合)
6. 關系: < <= > >= (左結合)
7. 相等: == != (左結合)
8. 位與: & (左結合)
9. 位異或: ^ (左結合)
10. 位或: | (左結合)
11. 邏輯與: && (左結合)
12. 邏輯或: || (左結合)
13. 條件: ? : (右結合)
14. 賦值: = += -= *= /= %= &= ^= |= <<= >>= (右結合)
15. 逗號: , (左結合)

表達式求值陷阱

1. 三元運算符


a < b ? a : b  // 返回較小值,注意優先級低於賦值
int max = (a > b) ? a : b; // 建議加括號

2. 強制類型轉換


int a = 10;
double b = 10.23;
printf("%d\n", (int)(a + b)); // 20,先加後截斷
printf("%d\n", a + (int)b);   // 20,先截斷後加

3. 自增自減副作用(未定義行為風險)


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 進階

  • 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)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved