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

C 語言核心細節筆記:整數除法、sizeof 與 strlen、隱式轉換、複數類型等

     編輯:關於C

1. 整數除法與求模(取餘)的符號規則

  • 除法 /:結果符號與數學一致,**異號為負**,同號為正。例:45 / -7 = -6(向零截斷)。
  • 求模 %:結果符號**永遠與左操作數(被除數)相同**(「同左性」)。
      45 % -7 = 3、-45 % 7 = -3、-45 % -7 = -3。
  • C99 規定:(a/b)*b + a%b == a,且 a/b 向零截斷。

2. 變數與記憶體基礎

  • 同類型變數佔用相同大小記憶體;不同類型大小不同。
  • 字面常量前綴:0x/0X 十六進制、0 八進制、**無前綴** 十進制。
      ⚠️ 切勿在十進制前加 0,否則被視為八進制(如 010 == 8)。

3. 浮點數格式指定符完整形式

%[width][.precision][modifier]f/e/g
// 例:%-15.4Lf  → 左對齊、寬度 15、小數點後 4 位、long double
  • width:最小輸出字符寬度,預設右對齊;- 旗標改為左對齊。
  • precision:小數點後位數(f/e)或有效數字(g)。
  • modifier:L 表示 long double,l 對 printf 無效(float 自動提升為 double)。

4. #define 與常量定義

  • 慣例:宏名稱**全大寫**(如 #define PI 3.1415f)。
  • 兩種定義常量方式:
    1. #define PI 3.1415f —— 純文本替換,無類型檢查,不佔記憶體。
    2. const float Pi = 3.1415f; —— 有類型、有作用域、佔記憶體(除非被優化),編譯器禁止修改,**強烈推薦**。

5. sizeof 與 strlen 核心區別(重點)

特性sizeofstrlen
本質編譯期運算符運行期庫函數
單位位元組字符數(不含結束符 \0)
參數類型或表達式(類型需括號)char* (以 \0 結尾)
陣列參數**不退化**,得整個陣列大小退化為指針,得字串長度
指針參數得指針本身大小 (4/8 bytes)得字串長度
計算時機編譯期(VLA 除外)運行期逐字符掃描

經典範例

char str[20] = "0123456789";  // 10 字符 + \0
strlen(str);   // 10
sizeof(str);   // 20 (陣列大小)

char *ss = "0123456789";
sizeof(ss);    // 4/8 (指針大小)
sizeof(*ss);   // 1 (char 大小)
strlen(ss);    // 10

char ss2[] = "0123456789";
sizeof(ss2);   // 11 (含 \0)
strlen(ss2);   // 10

int arr[100];
sizeof(arr);   // 400 (100 * sizeof(int))
// strlen(arr); // 編譯錯誤:參數類型不匹配

函數參數陷阱

void fun(char szPath[MAX_PATH])  // 相當於 void fun(char *szPath)
{
    sizeof(szPath);  // 4/8 (指針大小),非 MAX_PATH!
}

**口訣**:sizeof 看**棧上佔用空間**;陣列名進函數**退化為指針**,sizeof 只見指針大小。

6. 隱式類型轉換(整數提升 / 算術轉換)

編譯器按優先級自動轉換:

  1. long double → 另一操作數轉為 long double
  2. double → 轉為 double
  3. float → 轉為 float
  4. 整數提升:char/short/bit-field → int (或 unsigned int)
  5. 之後按「無符號優先、長度優先」規則進一步轉換。

**經典坑**:

unsigned int ui = 1;
signed short s = -1;  // 提升為 int -1
if (s > ui) printf("-1 > 1");   // 成立!-1 提升為 unsigned int 變巨大
if (s < 1)  printf("-1 < 1");   // 也成立!比較時 1 為 int

7. 其他實用小知識

  • 字符大小寫轉換:letter = letter - 'A' + 'a';(僅限 ASCII 連續編碼環境,推薦用 tolower())。
  • 十六進制輸出 char:printf("%x", ch);。
  • 寬字符:wchar_t、L"string"、%ls。
  • C99 複數類型:float complex、double complex、long double complex。
      例:double complex z = 2.0 + 3.0*I;、creal(z)、cimag(z)。
  • 常用數學函數 (math.h):floor/ceil/fabs/log/log10/exp/sqrt/pow。

8. 結構體對齊與 sizeof 補充

struct O { int a,b,c,d,e,f,g,h; };  // 32 bytes (假設 int 4, 無填充)
O &r = *new O;
sizeof(O);  // 32
sizeof r;   // 32 (引用不佔空間,sizeof 引用 = sizeof 被引用對象)

指針無論指向靜態/堆疊/堆記憶體,sizeof(ptr) 永遠是指針大小。

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